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

StackOverflow https://stackoverflow.com/questions/1412582

  •  06-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top