2013-06-26 11 views
5

Quando si esegue il debug di funzioni chiamando altre funzioni in molti livelli tramite il browser, è spesso difficile sapere quale livello immettere per l'ispezione di una particolare variabile. È criptico quando le funzioni contengono apply, sapply, lapply chiamate che producono livelli intermedi. C'è un modo per cercare una variabile per nome su tutti i livelli dello stack?Ricerca di oggetti nello stack di chiamate quando si utilizza il browser

Diciamo che ho le seguenti funzioni, producendo un errore in f3. Suppongo che quando si entra al livello 5 dovrei essere in grado di elencare il contenuto di qualsiasi ambiente sopra quello in cui mi trovo attualmente, usando l'argomento pos o envir in qualche modo, ma non riesco a capire come. Come posso, ad esempio, cercare v2?

f1 <- function(){ 
    v1 <- 1 
    sapply(1:3, f2) 
} 
f2 <- function(...){ 
    v2 <- 2 
    f3() 
} 
f3 <- function(){ 
    v3 <- 3 
    stop("Oh no!") 
} 
> options(error=recover) 
> f1() 

Error in f3() : Oh no! 

Enter a frame number, or 0 to exit 

1: f1() 
2: #3: sapply(1:3, f2) 
3: lapply(X = X, FUN = FUN, ...) 
4: FUN(1:3[[1]], ...) 
5: #3: f3() 

risposta

5

si ottiene lo stack in un list con sys.frames. In questo caso, se si chiama sys.frames dopo l'avvio dello browser, si otterrà un list di lunghezza 9. I frame 6-9 includono la chiamata che ha generato l'errore e le chiamate coinvolte nell'avvio dello browser (è possibile vedere chiamando sys.calls). I primi cinque fotogrammi sono quelli visualizzati nello stack di chiamata che stampa recover. Una volta che i browser si avvia, si può guardare lo spazio dei nomi di ogni livello della stack nel tuo esempio con

lapply(sys.frames()[1:5], ls) 

o cercare il frame contenente la variabile con

which(sapply(sys.frames(), function(frame) 'v2' %in% ls(frame))) 
+0

Molto elegante, grazie! – Backlin

Problemi correlati