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中停止脚本.
我也尝试过return和break,但这只有在一个函数或循环工作.我搜索了其他可能的关键字,如"停止"和"结束",但没有运气.我感觉有点愚蠢,因为这似乎是一个非常基本的问题.
那么,是否有一个命令可以使我的脚本停止/停止/结束致命错误?
我在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)
据我所知,没有一个命令可以在每个平台/版本上真正停止脚本.有几种方法可以解决这个问题:
把它放在函数或花括号中:
{
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 中
stop("Error message")
Run Code Online (Sandbox Code Playgroud)
call 实际上在打印错误消息后停止了脚本的执行。