在会话中更改tempdir()(更新R_TempDir)

时间:2012-04-25 19:29:12

标签: c r cran

我正在寻找一种在R会话开始后更改tempdir()位置的方法。我认为需要更新C级全局变量R_TempDir。从R内部做这件事的好方法是什么?

5 个答案:

答案 0 :(得分:5)

如果您解锁tempdir()并重新为baseenv()分配新功能,则可能有效:

tempdir <- function() "/NewTempDir"
unlockBinding("tempdir", baseenv())
assignInNamespace("tempdir", tempdir, ns="base", envir=baseenv())
assign("tempdir", tempdir, baseenv())
lockBinding("tempdir", baseenv())

答案 1 :(得分:5)

更新:Simon Urbanecks unixtools package有完成此任务的功能。代码下方(供将来参考)。

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;
}

答案 2 :(得分:3)

这非常俗气,但你可以通过说

来掩饰base::tempdir
tempdir <- function() { "[desired temp dir here]" }

只要您没有使用(隐式或显式)在全局环境之前查找基本命名空间的代码,您就可以了......

我真的没有看到任何其他方法来做到这一点,因为它是在初始化时设置的,之后没有改变。换句话说,Sys.setenv(TMPDIR="/home/bolker/R")不起作用 - 为时已晚(你可能知道)。

如果tempdir()的硬编码不那么简单,那就太容易了......我真的不明白这里的设计标准(或者,更不用说慈善,是否有经过深思熟虑的设计标准.. )。 (我对.libPaths()的硬编码/设计感到同样脾气暴躁,这是类似的......一旦你在正在运行的R会话中就无法改变事情。)

答案 3 :(得分:3)

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

值得一提的是,编写一个使用大量空间用于临时文件的脚本/包的程序员应该像@JoãoDaniel所说的那样处理tmpdir。

答案 4 :(得分:1)

tempdir()函数是创建临时目录的好方法,因此您可以在会话的最后一个时间内存储有效的文件。它返回在会话开始时创建的临时目录,默认情况下存储由tempfile()创建的新临时文件。

但是它与工作目录无关。如果要更改工作目录,则应使用命令setwd()

如果要更改存储临时文件的目录,应将其设置为命令的参数。

tempfile(tmpdir="/my/path/to/tmpfile")