如何在R中停止/结束/暂停脚本?

RHA*_*RHA 23 error-handling r stoppropagation

我写了一个脚本,如果提供的数据不正确,应停止执行.但是,虽然stop会生成错误消息,但脚本仍会继续.一个最小的例子:

if (TRUE) {stop("End of script?")} #It should stop here
print("Script did NOT end!") # but it doesn't, because this line is printed!
Run Code Online (Sandbox Code Playgroud)

控制台输出:

> if (TRUE) {stop("End of script?")}
Error: End of script?
> print("Script did NOT end!")
[1] "Script did NOT end!"
>
Run Code Online (Sandbox Code Playgroud)

这实际上并不奇怪,因为来自?stop:

停止执行当前表达式并执行错误操作.

所以它只结束当前表达式,而不是脚本.我在这里发现你可以将{}包裹在整个脚本周围(或者将它放在一个函数中),但这似乎是一种解决方法而不是解决方案.当然,捕获错误并自行处理它们是很好的编程习惯(例如参见mra68中的注释中的链接),但我仍然想知道是否可以在R中停止脚本.

我也尝试过returnbreak,但这只有在一个函数或循环工作.我搜索了其他可能的关键字,如"停止"和"结束",但没有运气.我感觉有点愚蠢,因为这似乎是一个非常基本的问题.

那么,是否有一个命令可以使我的脚本停止/停止/结束致命错误?

我在Windows 8上运行R 3.2.3,但在MAC-OSX上与R 3.0.1有同样的问题.

> sessionInfo()
R version 3.2.3 (2015-12-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

locale:
[1] LC_COLLATE=Dutch_Netherlands.1252  LC_CTYPE=Dutch_Netherlands.1252    LC_MONETARY=Dutch_Netherlands.1252
[4] LC_NUMERIC=C                       LC_TIME=Dutch_Netherlands.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

loaded via a namespace (and not attached):
[1] tools_3.2.3
Run Code Online (Sandbox Code Playgroud)

测试MAC-OS,sessionInfo()

R version 3.0.1 (2013-05-16)
Platform: x86_64-apple-darwin10.8.0 (64-bit)

locale:
[1] nl_NL.UTF-8/nl_NL.UTF-8/nl_NL.UTF-8/C/nl_NL.UTF-8/nl_NL.UTF-8
Run Code Online (Sandbox Code Playgroud)

RHA*_*RHA 9

据我所知,没有一个命令可以在每个平台/版本上真正停止脚本.有几种方法可以解决这个问题:

把它放在函数或花括号中:

{
if (TRUE) {stop("The value is TRUE, so the script must end here")}

print("Script did NOT end!")
}
Run Code Online (Sandbox Code Playgroud)

或者评估错误并像在if else构造中一样处理它:

if (TRUE) {stop("The value is TRUE, so the script must end here")    
  } else { #continue the script
print("Script did NOT end!")   
  }
Run Code Online (Sandbox Code Playgroud)

或(编辑):另一种可能性是从一个单独的'主'R-scipt调用脚本source("MyScript.R").然后脚本终止.但是,这会将除错误之外的所有输出抑制到控制台.

或者对于更复杂的操作,请使用此处tryCatch()所示


小智 8

也许为时已晚,但是我最近遇到了同样的问题,发现对我来说最简单的解决方案是使用:

quit(save="ask")
Run Code Online (Sandbox Code Playgroud)

从中?quit可以看到:

save必须是“否”,“是”,“询问”或“默认”之一。在第一种情况下,不保存工作空间,在第二种情况下,保存工作空间,在第三种情况下,提示用户并且还可以决定不退出。默认设置是在交互使用中询问,但可以被命令行参数覆盖(必须在非交互使用中提供)。

然后,您可以通过在弹出消息框时单击“取消”来决定不退出R。

希望有帮助!

  • 在 RStudio 中,此命令会终止 R,并且 RStudio 会提示您重新启动会话 (2认同)

rtr*_*trt 5

请注意,在 RStudio 中

stop("Error message")
Run Code Online (Sandbox Code Playgroud)

call 实际上在打印错误消息后停止了脚本的执行。

  • 不,剧本还在继续。 (3认同)