使用R中的main函数

Blu*_*eet 11 r

我已经使用R 4个月了,我真的希望有一种方法可以像其他语言一样使用"main"函数:C++,python ......

我想要的主要原因是我在R脚本中使用的所有变量都是全局变量,可能会污染我在同一个脚本中定义的任何函数,如下所示:

f <- function(x) {
  x + a
}
a <- 50
f(5)
Run Code Online (Sandbox Code Playgroud)

对我来说,这只是个人偏好.我是一个邋program的程序员,我想防止自己犯下愚蠢的错误.

我当然可以定义main < - function(){},但是有类似的东西

if __name__ == "__main__": 
    main()
Run Code Online (Sandbox Code Playgroud)

在python?所以我可以轻松运行脚本?(上面的代码表示:在这个脚本中,如果函数名是"main",则运行"main()",即调用main函数)

Lei*_*sen 10

所以,它并不完全相同__name__ == "__main__",但你可能会发现interactive这里的功能很有趣.TRUE如果您处于交互模式,则会返回.

所以你可以这样做:

main <- function() {
    ....
}

if(!interactive()) {
    main()
}
Run Code Online (Sandbox Code Playgroud)

这有点不同,因为如果脚本需要它将始终运行.

  • 如果我在交互模式下使用 source("..") ,这将不起作用。 (2认同)

Kon*_*lph 5

但是有没有类似的东西

if __name__ == "__main__": 
    main()
Run Code Online (Sandbox Code Playgroud)

在蟒蛇?

确实有!

但是您需要使用包“ box ”而不是source/packages。然后,在你的模块中,你可以写

if (is.null(box::name())) …
Run Code Online (Sandbox Code Playgroud)

… 相当于 Python 的if __name__ == '__main__'.

或者您甚至可以使用该klmr/sys模块。然后你可以写以下内容:

box::use(klmr/sys)

f = function(x) {
    x + a
}

sys$run({
    a = 50
    sys$print(f(5))
})
Run Code Online (Sandbox Code Playgroud)

如果您在命令行(通过RscriptR CMD BATCH)执行此脚本,它将执行由 指定的主要功能sys$run。相反,如果将此脚本作为模块导入到另一个脚本中,则不会执行 main 函数,但f仍会被定义和导出。