5

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

4

5 回答 5

7

更新: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;
}
于 2013-06-25T18:45:22.067 回答
5

如果您解锁tempdir()并重新分配一个新功能,baseenv()它可能会起作用:

tempdir <- function() "/NewTempDir"
unlockBinding("tempdir", baseenv())
assignInNamespace("tempdir", tempdir, ns="base", envir=baseenv())
assign("tempdir", tempdir, baseenv())
lockBinding("tempdir", baseenv())
于 2013-04-24T21:16:35.380 回答
4

这非常俗气,但你可以base::tempdir

tempdir <- function() { "[desired temp dir here]" }

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

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

如果tempdir()不那么硬编码,它会容易得多......我不太了解这里的设计标准(或者,不那么仁慈的是,是否有经过深思熟虑的设计标准......)。(我对 的硬编码/设计也感到同样的脾气暴躁.libPaths(),这是相似的......一旦你在运行的 R 会话中,就没有办法改变事情。)

于 2012-04-25T20:35:25.017 回答
4

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ão Daniel 提到的方式处理 tmpdir。

于 2016-10-13T09:09:10.287 回答
1

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

但是它与工作目录无关。如果你想改变工作目录,你应该使用命令setwd()

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

tempfile(tmpdir="/my/path/to/tmpfile")
于 2012-04-25T20:09:51.660 回答