R中是否有命令会返回包含正在执行的代码的文件的完整目录路径,类似于PHP $_SERVER['SCRIPT_FILENAME']
?
答案 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)