我正在寻找一种在R会话开始后更改tempdir()位置的方法。我认为需要更新C级全局变量R_TempDir。在R中做这件事的好方法是什么?
发布于 2013-06-26 02:45:22
更新: 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;
}发布于 2013-04-25 05:16:35
如果您解锁tempdir()并将新函数重新分配给baseenv(),它可能会起作用:
tempdir <- function() "/NewTempDir"
unlockBinding("tempdir", baseenv())
assignInNamespace("tempdir", tempdir, ns="base", envir=baseenv())
assign("tempdir", tempdir, baseenv())
lockBinding("tempdir", baseenv())发布于 2012-04-26 04:35:25
这太俗气了,但你可以用下面的话来掩饰base::tempdir
tempdir <- function() { "[desired temp dir here]" }那么,只要您没有使用(隐式或显式地)在全局环境之前查看基本名称空间的代码,您就没有问题……
我真的看不到任何其他方法来做这件事,因为它是在初始化时设置的,并且在初始化后不会改变。换句话说,Sys.setenv(TMPDIR="/home/bolker/R")不能工作--为时已晚(正如您可能知道的那样)。
如果tempdir()不那么硬编码,事情就会容易得多……我真的不理解这里的设计标准(或者,不那么仁慈地说,是否有仔细考虑过的设计标准...)。(我对.libPaths()的硬编码/设计也有类似的不满……一旦处于运行的R会话中,就无法更改。)
https://stackoverflow.com/questions/10322451
复制相似问题