Остановить программу R без ошибок - программирование

Остановить программу R без ошибок

Есть ли способ остановить программу 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 }, но он очищает проблему, а не решает ее.

Есть ли лучший вариант?

4b9b3361

Ответ 1

Вы ищете функцию browser.

Ответ 2

В списке рассылки

Ответ 3

Я нашел довольно аккуратное решение здесь. Хитрость заключается в отключении всех сообщений об ошибках непосредственно перед вызовом 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).

Ответ 4

У меня есть аналогичная проблема, и, основываясь на ответе @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: в сообщении.