Если R не выйдет из отладчика, если ошибка

Когда я в отладчике (из инструкции browser для ex.), если я нахожу код, который дает ошибку, R завершает отладчик. Но я хочу остаться в нем. Как я могу сделать это автоматически (например, я не хочу, чтобы вручную приходилось запоминать параметр reset (ошибка) для чего-то, когда я в отладчике.

Ответ 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, чтобы отладчик выполнил следующую строку вашего кода). Таким образом, вы получите сообщение об ошибке, но поскольку оно было вызвано пользователем, а не фактически выполняло строку отлаживаемого кода, отладчик не выйдет.

Пожалуйста, не стесняйтесь комментировать, если это неясно.