返回包含文件的目录

时间:2012-02-03 16:42:20

标签: r

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

3 个答案:

答案 0 :(得分: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:/ 

答案 1 :(得分:2)

我可以想到三个答案,其中没有一个可能完全令您满意,因为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 :(得分:1)

虽然这有点脆弱,因为它依赖于source命令的内部(可能在将来的R版本中更改),源文件中的这一行应该这样做。它必须直接位于源文件的顶层,而不是源文件中的函数。

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