【问题标题】:Change tempdir() in session (update R_TempDir)在会话中更改 tempdir()(更新 R_TempDir)
【发布时间】:2012-04-25 19:29:11
【问题描述】:

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

【问题讨论】:

    标签: c r cran


    【解决方案1】:

    更新: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;
    }
    

    【讨论】:

    • 完全正确! install.packages('unixtools', repos = 'http://www.rforge.net/'); unixtools::set.tempdir("/new/tmp/path") 成功了。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这很俗气,但你可以通过说来掩盖base::tempdir

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

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

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

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

      【讨论】:

      • 这行不通。大多数调用 tempdir 的函数实际上都在基本包中。我真的需要修改 C 级全局的东西。
      • ps:.libPaths() 实际上并没有那么硬编码。这是设置它们的代码 sn-p:pastebin.com/E2sVKr30
      • 我不认为你可以。我认为 R 将其视为设置后的“常量”。
      【解决方案4】:

      2016 年,我的品味和用例仍然没有找到好的答案。 我遇到了同样的问题,发现从用户的角度来看,以下解决方案是最干净的:

      # test.R content
      message(tempdir())
      

      现在在脚本运行时更改根 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。

      【讨论】:

      • 2017 年,它运行良好,我不想安装任何其他软件包,所以我选择了这个解决方案,它可以工作,谢谢!!!
      【解决方案5】:

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

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

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

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

      【讨论】:

      猜你喜欢
      • 2011-01-19
      • 2016-05-11
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-07
      • 2018-02-12
      • 1970-01-01
      相关资源
      最近更新 更多