Получение состояния переменных после возникновения ошибки в R - PullRequest
16 голосов
/ 11 сентября 2009

Допустим, я только что вызвал функцию 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 и увидеть, что их длина различна. (Этот пример может быть слишком простым, но я надеюсь, что он поможет понять идею.)

Ответы [ 3 ]

26 голосов
/ 11 сентября 2009

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

Сначала позвоните по этому номеру:

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
3 голосов
/ 13 сентября 2009

options(error=recover)

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

3 голосов
/ 12 сентября 2009

Вы также можете просто использовать функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...