【问题标题】:Returning directory of containing file包含文件的返回目录
【发布时间】:2012-02-03 16:42:19
【问题描述】:

R 中是否有命令返回包含正在执行的代码的文件的完整目录路径,类似于 PHP 的 $_SERVER['SCRIPT_FILENAME']

【问题讨论】:

  • 你是如何执行代码的?
  • 也许getwd() 是您要找的?但回答约书亚会有帮助!
  • @JoshuaUlrich - 我正在使用RStudio

标签: r


【解决方案1】:

我能想到三个答案,但其中没有一个可能让您完全满意,因为 R 执行模型与 PHP 不同。这是按顺序排列的:a) R 可执行文件的位置,b) 源文件的默认目录的位置,以及 c) 如果没有给出明确的位置,R 将搜索已安装包的位置:

 R.home()
#[1] "/Library/Frameworks/R.framework/Resources"
 getwd()
#[1] "/Users/davidwinsemius"
 .libPaths()
#[1] "/Users/davidwinsemius/Library/R/2.14/library"                   
#[2] "/Library/Frameworks/R.framework/Versions/2.14/Resources/library"

我想到了第四个选项,这可能是您真正想要的。如果您已经使用 CMD 调用启动了 R 的批处理会话,那么您可以使用第一行将 args 恢复到该命令,并且(可能,取决于您如何进行调用和您的操作系统)识别输入文件:

cmdargs <- commandArgs(TRUE)  
cmdargs["infile"]

【讨论】:

    【解决方案2】:

    最简单的方法是调用source 来执行带有chdir=TRUE 参数的脚本。那么脚本只需要调用getwd()。然而,这依赖于脚本的调用者来做正确的事情。

    另一种方法是实现每个功能通常保存源信息(可以禁用)。因此,如果您在脚本中定义了一个函数,您可以从函数实例中提取文件名。

    将以下内容放入“c:/foo.R”(或 Linux 上的“/tmp/foo.R”)中:

    whereAmI <- function() attr(attr(whereAmI, 'srcref'), 'srcfile')$filename
    
    fileName <- whereAmI()
    cat("Here I am:", fileName, "\n")
    cat("In folder:", dirname(fileName), "\n")
    

    ...那就试试吧:

    > source("c:/foo.R")
    Here I am: c:/foo.R
    In folder: c:/ 
    

    【讨论】:

    • 那么这是最后一个被字节编译的函数的随机生成位置吗?
    • 不适合我 (R 2.14.0),即使我打电话给 compiler::enableJIT(4)。你得到一个奇怪的结果吗?
    • 我得到:“我在这里:/var/folders/xS/xSUSVXTIHEiP7OLJg2OXmU+++TI/-Tmp-//RtmpqeJtDX/file1f9196a0”。由于这不涉及对 whereAmI 的任何调用,因此我假设它是最后定义的函数的位置。
    • 不,那是tmp &lt;- tempfile()。请改用tmp &lt;- 'c:/foo.R'tmp &lt;- '/tmp/foo.R'
    【解决方案3】:

    虽然这有点脆弱,因为它取决于source 命令的内部结构(在未来的 R 版本中可能会发生变化),源文件中的这一行应该可以做到。它必须直接位于源文件的顶层,而不是源文件的函数中。

    this.dir <- dirname(sys.frame(1)$ofile)
    

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 2023-04-07
      • 2013-05-03
      • 1970-01-01
      • 2011-03-21
      • 2015-01-31
      • 2016-08-18
      • 2021-05-14
      • 1970-01-01
      相关资源
      最近更新 更多