2012-03-21 21 views
14

Al depurar una función, me gustaría pasar al cuadro principal y ver algunas variables allí. ¿Cómo hago esto?mover un marco, depurar el entorno R

Este es un ejemplo:

f <- function() { 
    x <-1 
    g(x+1) 
} 
g <- function(z) { 
    y = z+2 
    return(y) 
} 

entonces puedo depurar ambas funciones utilizando debug("g") y debug("f"). Cuando termino en g en el Browser>, me gustaría volver a subir al f para examinar x.

Gracias

Respuesta

11

En la terminología R, que está deseando investigar el marco padre del entorno de evaluación g() 's (es decir, el entorno en el que se llamaba g). Las funciones para hacerlo están documentadas en la página de ayuda para ?sys.parent.

Una vez que su navegador indique que es 'debugging in g(x + 1)', puede hacer lo siguiente. (Gracias a Joshua Ulrich por sugerir where para ayudar a localizar las posiciones en la pila de llamadas.)

# Confirm that you are where you think you are 
where 
# where 1 at #3: g(x + 1) 
# where 2: f() 

# Get a reference to g()'s parent frame (an environment object) 
pframe <- parent.frame() 
pframe 
# <environment: 0x019b9174> 

# Examine the contents of the parent frame 
ls(env=pframe) 
# [1] "x" 

# Get the value of 'x' in the parent frame 
get("x", env = pframe) 
# [1] 1 

EDITAR: Para comprender el conjunto de funciones que se describen en ?sys.parent, es probablemente la pena señalar que parent.frame() es (básicamente) taquigrafía para sys.frame(sys.parent(1)). Si se encuentra en un entorno de evaluación más abajo en una pila de llamadas (como lo revela where, por ejemplo), puede acceder a entornos que se encuentren más atrás en la pila de llamadas (digamos dos pasos) por parent.frame(2) o sys.frame(sys.parent(2)).

+4

Tecleando 'where' mientras está en el navegador parece que sería útil determinar a cuántos marcos debe retroceder. –

+0

Gracias a Joshua por esa sugerencia tan útil. Lo agarré directamente de tu comentario y lo pegué en la parte superior del bloque de código. –

+0

Gracias a todos por las excelentes respuestas. – Alex

24

Puede utilizar recover (que a menudo se utiliza para depurar el código después de un error real, a través de options(error=utils::recover), pero se le puede llamar directamente).

> f() 
debugging in: g(x + 1) 
debug at #1: { 
    y = z + 2 
    return(y) 
} 
Browse[2]> ls() 
[1] "z" 
Browse[2]> recover() 

Enter a frame number, or 0 to exit 

1: f() 
2: #3: g(x + 1) 

Selection: 1 
Called from: top level 
Browse[3]> ls() 
[1] "x" 
Browse[3]> x 
[1] 1 
Browse[3]> 
+3

Muy bueno. Nunca se me había ocurrido que 'recover()' pudiera llamarse de forma interactiva. A veces creo que debería simplemente sentarme y ver que el resto de ustedes responden todas las preguntas, y este tipo de gema es exactamente el motivo. –

+1

Genial, gracias por esto ... muy útil. – Alex

Cuestiones relacionadas