Changer tempdir () en session (update R TempDir)
je cherche un moyen de changer le lieu tempdir()
après le début d'une session R. Je pense qu'il serait nécessaire de mettre à jour la variable globale de niveau C R_TempDir
. Quelle serait une bonne façon de faire cela de L'intérieur de R?
5 réponses
si vous déverrouillez tempdir()
et réattribuez une nouvelle fonction au baseenv()
cela pourrait fonctionner:
tempdir <- function() "/NewTempDir"
unlockBinding("tempdir", baseenv())
assignInNamespace("tempdir", tempdir, ns="base", envir=baseenv())
assign("tempdir", tempdir, baseenv())
lockBinding("tempdir", baseenv())
mise à Jour: Simon Urbanecks unixtools package a une fonction pour cela. Sous le code (pour référence future).
set.tempdir <- function(path) {
invisible(.Call(C_setTempDir, path.expand(path)))
}
C code:
#include <string.h>
#include <Rinternals.h>
#include <Rembedded.h>
SEXP C_setTempDir(SEXP sName) {
if (TYPEOF(sName) != STRSXP || LENGTH(sName) != 1)
Rf_error("invalid path");
R_TempDir = strdup(CHAR(STRING_ELT(sName, 0)));
return sName;
}
c'est terriblement ringard, mais vous pourriez masquer base::tempdir
en disant
tempdir <- function() { "[desired temp dir here]" }
alors vous seriez OK tant que vous n'utilisiez pas du code qui (implicitement ou explicitement) a regardé dans l'espace de noms de base avant l'environnement global ...
Je ne vois vraiment pas d'autre façon de faire cela, puisque c'est réglé au moment de l'initialisation et non modifié par la suite. En d'autres mots, Sys.setenv(TMPDIR="/home/bolker/R")
ne fonctionne pas -- il est trop tard (comme vous le savez probablement).
si tempdir()
était moins hard-codé il serait beaucoup plus facile ... Je ne comprends pas vraiment les critères de conception ici (ou, moins charitablement, s'il y avait des critères de conception soigneusement étudiés ...). (Je me sens également grognon au sujet du codage dur/conception de .libPaths()
, qui est similaire ... aucun moyen de changer les choses une fois que vous êtes dans une session R en cours d'exécution.)
année 2016, toujours pas vu une bonne réponse pour mon goût et cas d'utilisation. J'ai fait face au même problème et j'ai trouvé que la solution suivante est la plus propre du point de vue des utilisateurs:
# test.R content
message(tempdir())
changez maintenant le tempdir root à l'exécution d'un script:
mkdir rtmp; TMPDIR=$PWD/rtmp Rscript test.R; rm -rf rtmp
ou à l'exécution d'une expression:
mkdir rtmp; TMPDIR=$PWD/rtmp R -e 'tempdir()'; rm -rf rtmp
Il vaut également la peine de mentionner que d'un programmeur qui écrit un script qui utilise beaucoup d'espace pour les fichiers temp doivent gérer tmpdir comme @João Daniel l'a mentionné.
la fonction tempdir()
est une bonne façon de créer un répertoire temporaire pour que vous puissiez stocker des fichiers valides pendant la dernière partie de la session. Il retourne un répertoire temporaire créé au début de la session, et est l'endroit où les nouveaux fichiers temporaires créés par tempfile()
sont stockés par défaut.
cependant, il n'est pas lié au répertoire de travail. Si vous voulez changer le répertoire de travail, vous devez utiliser la commande setwd()
.
si vous voulez changer le répertoire où les fichiers temporaires sont stockés, vous devriez le Définir comme un paramètre sur la commande.
tempfile(tmpdir="/my/path/to/tmpfile")