if(interactive())是否是一个R,相当于pythonic的“if”\uuName_U==“uuMain”:main()?

2024-06-17 12:24:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 函数答案代码脚本ifismain模式
2条回答

获得所需控制权的最佳方法是使用选项。在

例如,'script.r'将如下所示:

main <- function() {
    message('main!')
}

if (getOption('run.main', default=TRUE)) {
   main()
}

如果您在交互模式下查找文件,并且不希望main执行,只需在调用source之前调用options(run.main=FALSE)。如果将脚本与knitr一起使用,并且希望main执行,请不要设置该选项,它将默认为TRUE。或者,如果您不希望main与knitr一起运行,请在调用之前调用options(run.main=FALSE)。在

你注意到了,不,这不是一回事。if(interactive())完全按照名字所说的做——它测试代码是否在交互式shell中运行。不多不少。在

R中没有Python中的if __name__ == '__main__'的直接等价物,因为R没有与Python相同的模块概念,sourced代码只是直接执行。在

但是,您可以编写自己的source命令来替换默认命令并执行必要的检查。在

也就是说,您链接的问题确实是contain an answer which presents a workaround,并且基本上复制了Python的功能。然而,这似乎不是您想要的,因为当被Knitr调用时,它将不会如您所期望的那样工作。在

相关问题 更多 >