我已经使用R 4个月了,我真的希望有一种方法可以像其他语言一样使用“main”函数:C ++,python ......
我想要的主要原因是我在R脚本中使用的所有变量都是全局变量,可能会污染我在同一个脚本中定义的任何函数,如下所示:
f <- function(x) {
x + a
}
a <- 50
f(5)
对我而言,这只是个人偏好。我是一个邋program的程序员,我想防止自己犯下愚蠢的错误。
我可以肯定地定义main&lt; - function(){},但是有类似于
的东西if __name__ == "__main__":
main()
在python中?所以我可以轻松运行脚本? (上面的代码表示:在这个脚本中,如果函数名是“main”,则运行“main()”,即调用main函数)
答案 0 :(得分:9)
所以,它与__name__ == "__main__"
并不完全相同,但您可能会发现interactive
函数在这里很有趣。如果您处于交互模式,则返回TRUE
。
所以你可以这样做:
main <- function() {
....
}
if(!interactive()) {
main()
}
这有点不同,因为如果脚本需要它,它总会运行。
答案 1 :(得分:3)
回答你的确切问题(我没有解决是否在R的背景下有意义。我只是开始深入研究R并发现它不适合编写非交互式程序所以我和#39;我把它归咎于我)。您可以创建一个main函数并将输入参数传递给它。但请注意,对于此项工作,您无法通过R
进行调用。您似乎需要使用Rscript
。
main <-function (argv)
{
if (length (argv) < 3)
{
cat ('usage error: requires at least 3 arguments\n',
file=stderr ());
return (1);
}
cat (sprintf ('This program was called with %d arguments\n',
length (argv)));
return (0);
}
if (identical (environment (), globalenv ()))
quit (status=main (commandArgs (trailingOnly = TRUE)));
答案 2 :(得分:3)
但是有什么类似的
if __name__ == "__main__": main()
在python中?
确实有!
但您需要使用‹modules›代替source
/ packages。然后,在您的模块中,您可以编写
if (is.null(module_name())) …
...这完全等同于Python的if __name__ == '__main__'
。
或您甚至可以使用klmr/sys
模块。然后你可以写下面的内容:
sys = modules::import('klmr/sys')
f = function(x) {
x + a
}
sys$run({
a = 50
sys$print(f(5))
})
如果在命令行上执行此脚本(通过Rscript
或R CMD BATCH
),它将执行sys$run
指定的main函数。相反,如果将此脚本作为模块导入另一个脚本,则不会执行main函数,但仍会定义和导出f
。
答案 3 :(得分:2)
不确定你的功能是什么意思,但也许解决方案是使用默认参数
f <- function(x, a = 45) {
x + a
}
a <- 50
f(5)
然后,如果您需要更改a
术语,请在函数内更改它,而不是依赖于调用它的上下文。
答案 4 :(得分:0)
您可以尝试以下方法...将下面的块放在R脚本中作为全局环境的一部分,它将在脚本执行时调用main()方法。
if(getOption("run.main", default=TRUE)) {
main()
}
希望这符合您的要求
if __name__ == "__main__":
main()