2017-02-15 18 views
7

При выполнении блока кода в RStudio выполнение фактически не останавливается при возникновении ошибки. Например, если у меня есть следующий код в открытом редакторе:Сделать остановку выполнения при ошибке в сеансе RStudio/Interactive R

x <- 'test' 
stopifnot(is.numeric(x)) 
print('hello world') 

И запустить его (либо с командой возврата или нажав на кнопку «Выполнить»), он выводит сообщение об ошибке, но затем марши и выполняет заявление печати.

Есть ли способ настроить RStudio, чтобы не пройти мимо ошибки? т. е. остановить его в строке 2 выше и не перейти к заявлению на печать?

EDIT: Только что это произошло, если я отправляю блоки кода в стандартном R GUI с помощью команды-R.

+0

Если вы выполните это как исходный файл, то он будет работать так, как вы хотите. Если вы, например, скопируете и вставьте 3 строки кода в консоль и нажмите «Ввод», тогда он будет запускать каждую строку кода отдельно. Этот второй режим, скорее всего, работает с кнопкой запуска. – lmo

+1

@lmo спасибо - проблема в том, что большинство людей я знаю программу в интерактивном режиме. Я пытаюсь написать учебник для социологов, чтобы поставить тесты в их код, и нужно встретить их там, где они есть. –

+0

Всегда есть 'tryCatch' и' try'. – lmo

ответ

0

Я не думаю, что есть способ предотвратить запуск RStudio всеми строками, когда вы выберете раздел и нажмите Ctrl + Enter. Rstudio работает только одна строка за другой. Даже если stopifnot() вызывается внутри функции, все строки после этого вызова функции будут по-прежнему вычисляться.

Если ваша цель просто быть проинформированной, когда что-то пойдет не так, прежде чем много кода будет запущено напрасно, возможно, вы можете определить функцию, похожую на stopifnot(), которая просто войдет в бесконечный цикл, если есть ошибка , Затем вы можете нажать Esc или кнопку Stop в RStudio, чтобы прервать программу. Что-то вроде этого:

waitifnot <- function(cond) { 
    if (!cond) { 
    message(deparse(substitute(cond)), " is not TRUE") 
    while (TRUE) {} 
    } 
} 

Теперь вы можете запустить пример кода с помощью этой функции:

x <- 'test' 
waitifnot(is.numeric(x)) 
print('hello world') 

Как и следовало ожидать, hello world никогда не печатается. Вы получите сообщение об ошибке, сообщив вам, что что-то пошло не так, и тогда программа будет ждать, пока вы ее не прекратите вручную.

Это не сработает в любой ситуации, кроме интерактивного режима. Чтобы избежать неприятных ситуаций, вы могли бы также позволить функции по-разному реагируют, если он не используется в интерактивном режиме, например, так:

waitifnot <- function(cond) { 
    if (!cond) { 
    msg <- paste(deparse(substitute(cond)), "is not TRUE") 
    if (interactive()) { 
     message(msg) 
     while (TRUE) {} 
    } else { 
     stop(msg) 
    } 
    } 
} 

Эта функция будет идти в бесконечный цикл только при запуске в интерактивном режиме. В противном случае он просто прекратит выполнение, вызвав stop(). Я проверил, что это работает, как и ожидалось, с помощью Ctrl + Enter или кнопки Source в RStudio (бесконечный цикл) и с Rscript в командной строке Bash (прерывание программы).