Изменить tempdir() в сеансе (обновить R_TempDir)
Я ищу способ изменить tempdir()
местоположение после начала сеанса R. Я думаю, что потребуется обновить глобальную переменную уровня C R_TempDir
, Что было бы хорошим способом сделать это изнутри R?
5 ответов
Обновление: пакет Simon Urbanecks unixtools имеет функцию для достижения этой цели. Ниже кода (для дальнейшего использования).
set.tempdir <- function(path) {
invisible(.Call(C_setTempDir, path.expand(path)))
}
Код C:
#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;
}
Если вы разблокируете tempdir()
и переназначить новую функцию baseenv()
это может сработать:
tempdir <- function() "/NewTempDir"
unlockBinding("tempdir", baseenv())
assignInNamespace("tempdir", tempdir, ns="base", envir=baseenv())
assign("tempdir", tempdir, baseenv())
lockBinding("tempdir", baseenv())
2016 год, до сих пор не нашел хорошего ответа на мой вкус и вариант использования. Я столкнулся с той же проблемой и обнаружил, что следующее решение является наиболее чистым с точки зрения пользователей:
# test.R content
message(tempdir())
Теперь измените root tempdir во время выполнения скрипта:
mkdir rtmp; TMPDIR=$PWD/rtmp Rscript test.R; rm -rf rtmp
Или во время выполнения выражения:
mkdir rtmp; TMPDIR=$PWD/rtmp R -e 'tempdir()'; rm -rf rtmp
Также стоит упомянуть, что программист, который пишет скрипт / пакет, который использует много места для временных файлов, должен обрабатывать tmpdir, как упомянул @João Daniel.
Это ужасно глупо, но ты можешь просто замаскировать base::tempdir
говоря
tempdir <- function() { "[desired temp dir here]" }
Тогда все будет в порядке, если вы не используете код, который (неявно или явно) просматривается в базовом пространстве имен перед глобальной средой...
Я действительно не вижу другого способа сделать это, так как он установлен во время инициализации и не изменяется после этого. Другими словами, Sys.setenv(TMPDIR="/home/bolker/R")
не работает - слишком поздно (как вы, наверное, знаете).
Если tempdir()
были менее жестко запрограммированы, это было бы намного проще... Я действительно не понимаю критерии дизайна здесь (или, менее мягко говоря, были ли тщательно продуманные критерии дизайна...). (Я чувствую себя таким же раздражительным из-за жесткого кодирования / дизайна .libPaths()
, что похоже... нет способа изменить положение вещей, когда вы находитесь в сеансе R).
tempdir()
Функция - хороший способ создать временный каталог, чтобы вы могли хранить файлы, действительные во время последнего сеанса. Он возвращает временный каталог, созданный в начале сеанса, и там, где новые временные файлы создаются tempfile()
хранятся по умолчанию.
Однако это не относится к рабочему каталогу. Если вы хотите изменить рабочий каталог, вы должны использовать команду setwd()
,
Если вы хотите изменить каталог, в котором хранятся временные файлы, вы должны установить это как параметр в команде.
tempfile(tmpdir="/my/path/to/tmpfile")