我希望R脚本具有在交互模式下执行的main()函数。但是在获取文件时不应执行main()函数。
There is already a question about this并且一个非常好的答案建议使用interactive()函数。然而,这对我不起作用。我没有足够的声誉点来评论或回答这个问题。所以我再次问这个问题。
我在script_1.r
if(interactive()){
your main code here
}
如果我使用knitr放弃html或pdf文档,请使用脚本。 if(interactive())
下的此代码将不会被执行。这对我有好处,这就是我想要的。
我的问题是,如果我在source("script_1.r")
处于交互模式下script_2.r
,它仍然会在此if(interactive())
部分下运行代码。
答案 0 :(得分:5)
获得所需控制的最佳方法是使用选项。
例如,'script.r'看起来像这样:
main <- function() {
message('main!')
}
if (getOption('run.main', default=TRUE)) {
main()
}
如果您要以交互模式获取文件并且不希望main
执行,请在致电options(run.main=FALSE)
之前致电source
。如果您使用带有knitr的脚本并且希望main
执行,请不要设置该选项,它将默认为TRUE
。或者如果您不希望主要使用knitr运行,请在调用之前调用options(run.main=FALSE)
。
答案 1 :(得分:1)
正如你所注意到的那样,不,这不是一回事。 if(interactive())
正如名称所说的那样 - 它测试代码是否在交互式shell中运行。不多也不少。
R中没有与Python中if __name__ == '__main__'
的直接等价,因为R没有与Python相同的模块概念,source
代码只是直接执行。
但是,您可以编写自己的source
命令来替换默认命令并执行必要的检查。
那就是说,你链接的问题确实 contain an answer which presents a workaround并且基本上复制了Python的功能。但是,这似乎并不是您想要的,因为它不会像Knitr调用时那样有效。