Получение состояния переменных после возникновения ошибки в 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
и увидеть, что их длина различна. (Этот пример может быть слишком простым, но я надеюсь, что он поможет понять идею.)
Решение
Как указано здесь , есть простое способ сделать это, и я думаю, что этот трюк может изменить жизнь к лучшему.
Сначала позвоните так:
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
Другие советы
Вы также можете просто использовать функцию 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
<код> Параметры (ошибка = восстановить) код>
Наверное, лучше всего отвечает на вопрос. Однако я хотел бы упомянуть еще один удобный инструмент отладки, traceback ()
. Вызывая это сразу после возникновения ошибки, часто достаточно, чтобы точно определить ошибку.