我知道我可以commandArgs
用来读取传递给 R 中脚本的命令行参数,但我想通过在 R 中对其进行调试source
并使用自定义命令行参数使其运行来调试命令行脚本。有没有办法在不修改脚本文件的情况下修改命令行参数?
如果有帮助,我的脚本通常使用该optparse
包进行实际参数解析。
我知道我可以commandArgs
用来读取传递给 R 中脚本的命令行参数,但我想通过在 R 中对其进行调试source
并使用自定义命令行参数使其运行来调试命令行脚本。有没有办法在不修改脚本文件的情况下修改命令行参数?
如果有帮助,我的脚本通常使用该optparse
包进行实际参数解析。
我将尝试扩展我在评论中所说的内容。
python 编写脚本的方式通常包括检测文件是否作为脚本运行,处理参数,然后调用文件中定义的函数。就像是:
def foo(x):
return x*2
if __name__=="__main__":
v = sys.argv[1]
print foo(v)
这样做的好处是您可以将文件导入交互式 python 会话,并且“if”块中的代码不会运行。foo
然后,您可以交互地测试该功能。
现在有没有一种方法可以检查 R 文件是作为脚本运行,还是来自交互式会话?
foo=function(x){
return(x*2)
}
if(!interactive()){
x = as.numeric(commandArgs(trailingOnly=TRUE)[1])
print(foo(x))
}
如果 run withRscript argtest.R 22
将打印 44,如果您以交互方式运行 R 并执行source("argtest.R")
它将不会运行 if 块中的代码。这是一个很好的模式。
如何简单地用您自己的定义覆盖它,例如
commandArgs <- function(trailingOnly=FALSE) {
args<- c("/foo/bar", "baz")
# copied from base:::commandArgs
if (trailingOnly) {
m <- match("--args", args, 0L)
if (m)
args[-seq_len(m)]
else character()
}
else args
}
最简单的解决方案是替换source()
为system()
. 尝试
system("Rscript file_to_source.R 1 2 3")