Остановить выполнение при ошибке в сеансе 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 (отмена программа.)