对commandArgs的写访问权限?

时间:2012-08-17 06:18:06

标签: r

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

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

3 个答案:

答案 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")