Я не думаю, что есть способ предотвратить запуск 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 (прерывание программы).
Если вы выполните это как исходный файл, то он будет работать так, как вы хотите. Если вы, например, скопируете и вставьте 3 строки кода в консоль и нажмите «Ввод», тогда он будет запускать каждую строку кода отдельно. Этот второй режим, скорее всего, работает с кнопкой запуска. – lmo
@lmo спасибо - проблема в том, что большинство людей я знаю программу в интерактивном режиме. Я пытаюсь написать учебник для социологов, чтобы поставить тесты в их код, и нужно встретить их там, где они есть. –
Всегда есть 'tryCatch' и' try'. – lmo