我知道我可以使用commandArgs
来读取传递给R中脚本的命令行参数,但我想通过source
在R中调试命令行脚本并进行调试使用自定义命令行参数运行。有没有一种方法可以在不修改脚本文件的情况下修改命令行参数?
我的脚本通常使用optparse
包进行实际的参数解析,如果有帮助的话。
答案 0 :(得分:4)
我会尝试扩展我在评论中所说的内容。
编写脚本的python方式通常涉及检测文件是作为脚本运行,处理args,然后调用文件中定义的函数。类似的东西:
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))
}
如果使用Rscript argtest.R 22
运行将打印44,如果以交互方式运行R并执行source("argtest.R")
,则不会运行if块中的代码。这是一个很好的模式。
答案 1 :(得分:3)
如何使用您自己的定义简单地覆盖它,例如
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
}
答案 2 :(得分:0)
最简单的解决方案是将source()
替换为system()
。试试
system("Rscript file_to_source.R 1 2 3")