Остановить выполнение при ошибке в сеансе RStudio / Interactive R

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

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

и запустите его (либо с помощью command-return, либо нажав кнопку "Выполнить"), он печатает ошибку, но затем переходит и выполняет инструкцию print.

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

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

1 ответов


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

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

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 (отмена программа.)