如果提供的数据不正确,我写了一个应该停止执行的脚本。但是,尽管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中停止脚本。
我还尝试了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
测试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
答案 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"