Ответ 1
Вы ищете функцию browser
.
Есть ли способ остановить программу R без ошибок?
Например, у меня есть большой источник, определяющий несколько функций, и после него есть некоторые вызовы функций. Бывает, что я редактирую некоторую функцию и хочу, чтобы определения функций обновлялись в среде R, но они фактически не вызываются.
Я определил переменную justUpdate
и когда она TRUE
хочет остановить программу сразу после определения функций.
ReadInput <- function(...) ...
Analyze <- function(...) ...
WriteOutput <- function(...) ...
if (justUpdate)
stop()
# main body
x <- ReadInput()
y <- Analyze(x)
WriteOutput(y)
Я вызвал функцию stop()
, но проблема в том, что она выводит сообщение об ошибке.
ctrl + c - это еще один вариант, но я хочу остановить источник в определенной строке.
Проблема с q()
или quit()
заключается в том, что она завершает сеанс R, но я хочу, чтобы сеанс R все еще был открыт.
В качестве предлагаемого browser() может быть другой вариант, но все же не идеальный, поскольку источник завершается в новой среде (т.е. подсказка R изменится на Browser[1]>
, а не на >
). Тем не менее мы можем нажать Q
, чтобы выйти, но я ищу простой способ.
Другой вариант - использовать if (! justUpdate) { main body }
, но он очищает проблему, а не решает ее.
Есть ли лучший вариант?
Вы ищете функцию browser
.
Я нашел довольно аккуратное решение здесь. Хитрость заключается в отключении всех сообщений об ошибках непосредственно перед вызовом stop()
. Функция on.exit()
используется для проверки того, что сообщения об ошибках снова включаются. Функция выглядит следующим образом:
stop_quietly <- function() {
opt <- options(show.error.messages = FALSE)
on.exit(options(opt))
stop()
}
Первая строка отключает сообщения об ошибках и сохраняет старую настройку переменной opt
. После этой строки любая возникшая ошибка не выведет сообщение, а также stop()
не приведет к печати какого-либо сообщения.
В соответствии с помощью справки R
on.exit
записывает выражение, указанное в качестве аргумента, которое должно выполняться при выходе текущей функции.
Текущая функция stop_quietly()
, и она выходит, когда вызывается stop()
. Итак, последнее, что делает программа, это вызов options(opt)
, который установит show.error.messages
на значение, которое у него было, до того, как был вызван stop_quietly()
(предположительно, но необязательно, TRUE
).
У меня есть аналогичная проблема, и, основываясь на ответе @VangelisTasoulas, я получил простое решение.
Внутри функции я должен проверить, обновляется ли БД. Если это не так, прекратите выполнение.
r=readline(prompt="Is DB updated?(y/n)")
Is DB updated?(y/n)n
if(r != 'y') stop('\r Update DB')
Update DB
Просто разместив \r
в начале сообщения, перезапишите Error:
в сообщении.