Получение состояния переменных после ошибки в 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()
. Вызов этого права после возникновения ошибки достаточно часто, чтобы определить ошибку.