2009-09-11 2 views
16

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 ocurriera el error.Obtener el estado de las variables después de un error en I

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

He aquí un ejemplo:

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

Calling 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 agarrar el estado del medio ambiente justo antes lm() se llama; de esa manera puedo llamar x y y y ver que sus longitudes son diferentes. (Este ejemplo puede ser demasiado simple, pero espero que se le ocurre al otro lado.)

Respuesta

26

Como se ha señalado here, hay una manera fácil de hacer esto, y creo que este truco tiene el potencial para cambiar la vida para mejor.

En primer lugar, llamar a esto:

options(error=recover) 

Ahora cuando llamamos f(x,y) tendremos la opción de elegir un medio para recuperarse. Aquí selecciono la opción 1, lo que abre un depurador y me permite jugar con las variables justo antes lm() se llama.

> 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 
+0

El enlace está muerto. ¡Me encantaría leer eso! Suspiro – Ameya

3

También puede simplemente utilizar la función de depuración():

> 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)

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

Cuestiones relacionadas