首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在会话中更改tempdir() (更新R_TempDir)

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

Stack Overflow用户
提问于 2012-04-26 03:29:12
回答 5查看 10.8K关注 0票数 5

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-06-26 02:45:22

更新: Simon Urbanecks unixtools package有一个函数可以实现这一点。下面的代码(供将来参考)。

代码语言:javascript
复制
set.tempdir <- function(path) {
  invisible(.Call(C_setTempDir, path.expand(path)))
}

C代码:

代码语言:javascript
复制
#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;
}
票数 7
EN

Stack Overflow用户

发布于 2013-04-25 05:16:35

如果您解锁tempdir()并将新函数重新分配给baseenv(),它可能会起作用:

代码语言:javascript
复制
tempdir <- function() "/NewTempDir"
unlockBinding("tempdir", baseenv())
assignInNamespace("tempdir", tempdir, ns="base", envir=baseenv())
assign("tempdir", tempdir, baseenv())
lockBinding("tempdir", baseenv())
票数 5
EN

Stack Overflow用户

发布于 2012-04-26 04:35:25

这太俗气了,但你可以用下面的话来掩饰base::tempdir

代码语言:javascript
复制
tempdir <- function() { "[desired temp dir here]" }

那么,只要您没有使用(隐式或显式地)在全局环境之前查看基本名称空间的代码,您就没有问题……

我真的看不到任何其他方法来做这件事,因为它是在初始化时设置的,并且在初始化后不会改变。换句话说,Sys.setenv(TMPDIR="/home/bolker/R")不能工作--为时已晚(正如您可能知道的那样)。

如果tempdir()不那么硬编码,事情就会容易得多……我真的不理解这里的设计标准(或者,不那么仁慈地说,是否有仔细考虑过的设计标准...)。(我对.libPaths()的硬编码/设计也有类似的不满……一旦处于运行的R会话中,就无法更改。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10322451

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档