Получение состояния переменных после ошибки в R

Скажем, я только что вызвал функцию, f, и где-то в функции произошла ошибка. Я просто хочу иметь возможность проверять значения разных переменных непосредственно перед возникновением ошибки.

Предположим, что моя кишка говорит мне, что это небольшая ошибка, поэтому я слишком ленив, чтобы использовать debug(f) и слишком ленив, чтобы вставить browser() в часть функции, где, я думаю, все идет не так. И мне слишком лениво начинать вставлять print() заявления.

Вот пример:

x <- 1:5
y <- x + rnorm(length(x),0,1)
f <- function(x,y) {
  y <- c(y,1)
  lm(y~x)
}

Вызов f(x,y) мы получаем следующую ошибку:

Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x')

В этом примере я хочу захватить состояние среды непосредственно перед вызовом lm(); таким образом я могу называть x и y и видеть, что их длины различны. (Этот пример может быть слишком простым, но я надеюсь, что он получит эту идею.)

Ответ 1

Как указано здесь, есть простой способ сделать это, и я думаю, что этот трюк может изменить жизнь к лучшему.

Сначала назовите это:

options(error=recover)

Теперь, когда мы вызываем f(x,y), у нас будет возможность выбрать среду для восстановления. Здесь я выбираю вариант 1, который открывает отладчик и позволяет мне играть с переменными непосредственно перед тем, как вызывается lm().

> f(x,y)
Error in model.frame.default(formula = y ~ x, drop.unused.levels = TRUE) : 
  variable lengths differ (found for 'x')

Enter a frame number, or 0 to exit   

1: f(x, y)
2: lm(y ~ x)
3: eval(mf, parent.frame())
4: eval(expr, envir, enclos)
5: model.frame(formula = y ~ x, drop.unused.levels = TRUE)
6: model.frame.default(formula = y ~ x, drop.unused.levels = TRUE)

Selection: 1
Called from: eval(expr, envir, enclos)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 1.6591197 0.5939368 4.3371049 4.4754027 5.9862130 1.0000000

Ответ 2

Вы также можете использовать функцию debug():

> debug(f)
> f(x,y)
debugging in: f(x, y)
debug: {
    y <- c(y, 1)
    lm(y ~ x)
}
Browse[1]> 
debug: y <- c(y, 1)
Browse[1]> x
[1] 1 2 3 4 5
Browse[1]> y
[1] 2.146553 2.610003 2.869081 2.758753 4.433881

Ответ 3

options(error=recover)

Наверное, лучше всего отвечает на вопрос. Однако я хотел упомянуть еще один удобный инструмент для отладки, traceback(). Вызов этого права после возникновения ошибки достаточно часто, чтобы определить ошибку.