Obtención del estado de las variables después de que se produce un error en R

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Digamos que acabo de llamar a una función, f , y se produjo un error en algún lugar de la función. Solo quiero poder verificar los valores de diferentes variables justo antes de que se produzca el error.

Supongamos que mi instinto me dice que es un error pequeño, por lo que soy demasiado perezoso para usar debug (f) y demasiado perezoso para insertar browser () en la parte de la función donde creo que las cosas van mal. Y soy demasiado perezoso para comenzar a poner declaraciones print () .

Aquí hay un ejemplo:

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

Al llamar a f (x, y) obtenemos el siguiente error:

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

En este ejemplo, quiero capturar el estado del entorno justo antes de llamar a lm () ; de esa manera puedo llamar a x y y y ver que sus longitudes son diferentes. (Este ejemplo puede ser demasiado simple, pero espero que se entienda la idea).

¿Fue útil?

Solución

Como se señaló aquí , hay una fácil manera de hacer esto, y creo que este truco tiene el potencial de cambiar vidas para mejor.

Primero, llama a esto:

options(error=recover)

Ahora, cuando llamemos a f (x, y) tendremos la opción de elegir un entorno para recuperar. Aquí selecciono la opción 1, que abre un depurador y me permite jugar con las variables justo antes de llamar a 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

Otros consejos

También puedes usar la función 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

options(error=recover)

Probablemente responde mejor la pregunta. Sin embargo, quería mencionar otra herramienta útil de depuración, traceback () . Llamar a esto justo después de que se haya producido un error es a menudo suficiente para identificar el error.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top