Изменить 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")
Другие вопросы по тегам