I wrote a script that should stop execution if the supplied data is incorrect. However, although stop
produces an error message, the script just continues. A minimal example:
if (TRUE) {stop("End of script?")} #It should stop here
print("Script did NOT end!") # but it doesn't, because this line is printed!
Console output:
> if (TRUE) {stop("End of script?")}
Error: End of script?
> print("Script did NOT end!")
[1] "Script did NOT end!"
>
This is actually not surprising, because from ?stop
:
stops execution of the current expression and executes an error action.
So it only ends the current expression, not the script. I have found here that you can wrap {} around the total script (or put it in a function), but that seems rather a workaround than a solution. Off course, it is good programming practice to catch error and handle them off yourself (see for example the link in comment from mra68), but I would still like to know if I can stop a script in R.
I have also tried return
and break
, but this only works in a function or loop. I searched for other possible keywords like "halt" and "end", but no luck. I am feeling a bit stupid, because it seems a very basic question.
So, is there a command that can make my script halt/stop/end with a fatal error ?
I am running R 3.2.3 on Windows 8, but had the same problem with R 3.0.1 at MAC-OSX.
> 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
TEST ON 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
As far as I could find, there is no single command that really stops a script on every platform/version. There are several ways to handle this:
Put it in a function or curly brackets:
{
if (TRUE) {stop("The value is TRUE, so the script must end here")}
print("Script did NOT end!")
}
OR evaluate the error and handle it like in an if else construction:
if (TRUE) {stop("The value is TRUE, so the script must end here")
} else { #continue the script
print("Script did NOT end!")
}
OR (EDIT):
Another possibility is to call the script from a seperate 'main' R-scipt, with source("MyScript.R")
. Then the script terminates. This however, suppresses all output other then errors to the console.
OR for more complex operations, use tryCatch()
as shown here