2016-01-14 2 views
9

Я написал сценарий, который должен остановить выполнение, если указанные данные неверны. Однако, хотя stop создает сообщение об ошибке, сценарий просто продолжается. Минимальный пример:Как остановить/остановить/остановить скрипт в R?

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:

stops execution of the current expression and executes an error action.

Так что только заканчивается ходячее выражение, а не сценарий. Я нашел here, что вы можете обернуть {} вокруг общего скрипта (или поместить его в функцию), но это кажется скорее обходным решением, чем решением. Конечно, это хорошая практика программирования, чтобы поймать ошибку и обработать их самостоятельно (см., Например, ссылку в комментарии от mra68), но я все равно хотел бы знать, могу ли я остановить скрипт в R.

У меня есть также пробовали return и break, но это работает только в функции или в цикле. Я искал другие возможные ключевые слова, такие как «halt» и «end», но не повезло. Я чувствую себя немного глупо, потому что это очень простой вопрос.

Итак, есть ли команда, которая может заставить мой скрипт останавливать/останавливать/заканчивать с фатальной ошибкой?

Я запускаю R 3.2.3 в Windows 8, но имел ту же проблему с R 3.0.1 на 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 

ТЕСТ НА 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 
+2

Я предлагаю, вы помещаете любой код, который вы хотите запустить в функции затем вызвать эту функцию. Затем вы можете использовать 'stop', и он должен прервать функцию в этой точке. Оператор функции в r также может быть использован для объявления методов, подобных другим языкам программирования, которые, возможно, могут вводить в заблуждение. –

+1

В моей системе (R версии 3.2.3, операционная система Windows 7) «stop» остановил сценарий. Если вы посмотрите на исходный код «stop», вы увидите, что его поведение зависит от некоторых внутренних функций, и они могут быть зависимыми от машины. – mra68

+0

[Эта ссылка] (http://adv-r.had.co.nz/beyond-exception-handling.html) может быть полезна. Но если это так, вопрос вовсе не является основным. – mra68

ответ

6

Насколько я мог бы найти, не ни одна команда, которая действительно останавливается на сценарий каждой платформы/версии. Есть несколько способов справиться с этим:

Положите его в функцию или фигурные скобки:

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

print("Script did NOT end!") 
} 

ИЛИ оценить ошибку и обработать его, как в, если другое строительство:

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

ИЛИ (EDIT): Другая возможность - вызвать скрипт из отдельного «основного» R-скромента с source("MyScript.R"). Затем скрипт завершается. Это, однако, подавляет все выходные сообщения, кроме ошибок, на консоль.

или для более сложных операций, использовать tryCatch(), как показано here

 Смежные вопросы

  • Нет связанных вопросов^_^