1

我知道我可以commandArgs用来读取传递给 R 中脚本的命令行参数,但我想通过在 R 中对其进行调试source并使用自定义命令行参数使其运行来调试命令行脚本。有没有办法在不修改脚本文件的情况下修改命令行参数?

如果有帮助,我的脚本通常使用该optparse包进行实际参数解析。

4

3 回答 3

4

我将尝试扩展我在评论中所说的内容。

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 块中的代码。这是一个很好的模式。

于 2012-08-17T07:03:48.333 回答
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
} 
于 2012-08-17T06:31:54.980 回答
0

最简单的解决方案是替换source()system(). 尝试

system("Rscript file_to_source.R 1 2 3")
于 2014-02-20T22:22:13.820 回答