使用R中的main函数

时间:2015-10-28 19:48:44

标签: r

我已经使用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函数)

5 个答案:

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

如果在命令行上执行此脚本(通过RscriptR 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()