2013-06-26 16 views
5

Podczas debugowania funkcji wywołujących inne funkcje na wielu poziomach za pomocą przeglądarki często trudno jest określić, na jaki poziom należy wprowadzić do kontroli konkretnej zmiennej. Jest to zagadkowe, gdy funkcje zawierają wywołania generujące poziomy pośrednie. Czy istnieje sposób na wyszukiwanie zmiennej według nazwy na wszystkich poziomach stosu?Wyszukiwanie obiektów w stosie wywołań podczas korzystania z przeglądarki

Załóżmy, że mam poniższe funkcje, powodując błąd w f3. Zakładam, że wchodząc na poziom 5 powinienem umieć wylistować zawartość dowolnego środowiska nad tym, w którym aktualnie się znajduję, używając argumentów w pewnym sensie, ale nie mogę zrozumieć, jak to zrobić. Jak mogę na przykład szukać 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() 

Odpowiedz

5

uzyskać callstack w list z sys.frames. W takim przypadku, jeśli zadzwonisz pod numer sys.frames po browser, otrzymasz list o długości 9. Ramki 6-9 zawierają wywołanie, które spowodowało błąd i wywołania związane z uruchomieniem browser (możesz to zobaczyć dzwoniąc pod numer sys.calls). Pierwsze pięć ramek jest wyświetlanych na stosie wywołań, które są drukowane. Po uruchomieniu browser, można spojrzeć na przestrzeni nazw każdego poziomu callstack W przykładzie z

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

lub poszukać ramki zawierającej zmienną

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

Bardzo elegancki, dziękuję! – Backlin

Powiązane problemy