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

时间:2016-01-14 10:19:58

标签: r error-handling 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!

控制台输出:

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

这实际上并不令人惊讶,因为来自?stop

  

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

所以它只结束当前表达式,而不是脚本。我发现here可以围绕整个脚本包装{}(或者将它放在一个函数中),但这似乎是一种解决方法,而不是解决方案。当然,抓住错误并自行处理错误是很好的编程习惯(例如参见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

测试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

3 个答案:

答案 0 :(得分:9)

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

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

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

print("Script did NOT end!")
}

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

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

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

或者对于更复杂的操作,请使用tryCatch()所示的apply plugin: "com.android.model.application" model { android { compileSdkVersion 23 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.camera.simplewebcam" minSdkVersion.apiLevel 15 targetSdkVersion.apiLevel 22 buildConfigFields { create() { type "int" name "VALUE" value "1" } } ndk { moduleName "ImageProc" } } buildTypes { release { minifyEnabled false proguardFiles.add(file("proguard-rules.pro")) } } // Configures source set directory. sources { main { jni { source { srcDir "src/main" } } } } productFlavors { create("arm") { ndk { abiFilters.add("armeabi-v7a") } } create("fat") { } } } dependencies { compile fileTree(dir: "lib", include: ['.jar','.so']) compile "com.android.support:appcompat-v7:23.+" }

答案 1 :(得分:3)

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

quit(save="ask")

?quit您可以看到:

  

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

然后您可以通过单击"取消"来决定不退出R.弹出消息框时。

希望有所帮助!

答案 2 :(得分:2)

非常简单:调用尚未声明的函数:

condition <- TRUE
if (condition) {
  print('Reason for stopping')
  UNDECLARED()
}

脚本将停止,并显示以下消息:

[1] "Reason for stopping"
Error in UNDECLARED() : could not find function "UNDECLARED"