Когда я в отладчике (из инструкции browser
для ex.), если я нахожу код, который дает ошибку, R завершает отладчик. Но я хочу остаться в нем. Как я могу сделать это автоматически (например, я не хочу, чтобы вручную приходилось запоминать параметр reset (ошибка) для чего-то, когда я в отладчике.
Если R не выйдет из отладчика, если ошибка
Ответ 1
Вы можете использовать options(error = recover)
. Это выйдет из сеанса отладки и сразу предложит ввести новый, с переменными, которые были в момент ошибки.
Например,
options(error = recover)
myfun <- function(x) x + "a" ; debug(myfun) ; myfun(2)
Это приводит к следующим интерактивным строкам:
debugging in: myfun(2)
debug: x + "a"
Browse[2]> n
Error in x + "a" (from #1) : non-numeric argument to binary operator
Enter a frame number, or 0 to exit
1: myfun(2)
Selection: 1
Browse[3]> ls()
[1] "x"
Browse[3]> print(x)
[1] 2
Browse[3]>
Чтобы это произошло автоматически, просто поместите вызов options(error=recover)
по умолчанию для сеанса.
Ответ 2
Ваша проблема может быть вызвана неправильным пониманием уровней отладки. Если, например, вы выполняете debug(myfunc); myfunc(...)
, а myfunc
вызывает некоторую другую функцию, то вызываемая функция не находится в режиме отладки. Если эта функция выдает ошибку, R
вполне корректно выходит из всей среды. Представьте, если это не так: что произойдет во время не-отладочного режима?
Одно из решений: после ввода myfunc
в режиме отладки, и вы знаете, какая вызываемая функция вызывает ошибку, выполнить debug(that_func)
, чтобы вы могли следовать ее пути к ошибке.
Другим обходным решением является вручную ввести вызов функции нарушения в приглашении отладки (вместо того, чтобы нажимать RETURN, чтобы отладчик выполнил следующую строку вашего кода). Таким образом, вы получите сообщение об ошибке, но поскольку оно было вызвано пользователем, а не фактически выполняло строку отлаживаемого кода, отладчик не выйдет.
Пожалуйста, не стесняйтесь комментировать, если это неясно.