if(interactive())是否等效于pythonic“if __name__ ==”__ main__“:main()”?

时间:2014-01-27 14:11:55

标签: python r

我希望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())部分下运行代码。

2 个答案:

答案 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调用时那样有效。