是否存在pythonic“if __name__ ==”__main__“:main()”的R等价物?

目标是有两个简单的方法来源代码,说func.R,包含一个函数。 调用R CMD BATCH func.R初始化函数并评估。 在一个会话中,发布source("func.R")只是初始化函数。 任何想法?

我认为interactive()函数可能会起作用。

当交互使用R时,该函数返回TRUE ,否则返回FALSE 。 所以只要使用if (interactive())

即相当于

 if (!interactive()) { main() } 

您可以将parameter passing给R,如果存在参数run main()。 更多关于这里的论点:http: //yangfeng.wordpress.com/2009/09/03/including-arguments-in-r-cmd-batch-mode/

这是很多工作,但我终于明白了(并在Rosetta Code上发布)。

这个例子导出了一个名为“ meaningOfLife的函数。 当脚本本身运行时,它将运行main 。 当被另一个R文件导入时,它不会运行main

 #!/usr/bin/Rscript meaningOfLife <- function() { 42 } main <- function(program, args) { cat("Main: The meaning of life is", meaningOfLife(), "\n") } getProgram <- function(args) { sub("--file=", "", args[grep("--file=", args)]) } args <- commandArgs(trailingOnly = FALSE) program <- getProgram(args) if (length(program) > 0 && length(grep("scriptedmain", program)) > 0) { main(program, args) q("no") } 

我问了一个类似的问题, 在回答中,Matthew Plourdebuild议在主脚本中使用getOption('run.main', default=TRUE) ,然后在调用source()之前设置options(run.main=FALSE) source() 。 这在我的情况下工作。

否则就是一个简单的模式,当你有一个R脚本创build一堆函数,并且你想在脚本的末尾写几行来试验一个函数的使用:把这些额外的行放在一个if(FALSE){}块。

另一个select是:

 #!/usr/bin/Rscript # runs only when script is run by itself if (sys.nframe() == 0){ # ... do main stuff }