2013-06-26 12 views
5

當使用瀏覽器調試多個級別的其他功能的調試功能時,通常很難知道檢查特定變量的級別。當功能包含apply,sapply,lapply調用產生中間級別時,它是神祕的。有沒有辦法在堆棧的所有級別上按名稱搜索變量?在使用瀏覽器時在調用堆棧中搜索對象

假設我有以下功能,在f3中產生錯誤。我會假設,當進入第5層時,我應該能夠以某種方式使用posenvir參數列出高於當前所在環境的任何環境的內容,但我無法弄清楚。我怎麼能找到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() 

回答

5

你獲得與sys.frames一個list調用堆棧。在這種情況下,如果在browser開始後撥打sys.frames,您將獲得長度爲9的list。第6-9幀包含引發錯誤的呼叫以及啓動browser時所涉及的呼叫(您可以通過調用sys.calls )。前五個框架是在recover打印的調用堆棧中顯示的框架。一旦browser開始,你可以看看在你的榜樣調用堆棧的每一層的命名空間

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

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

非常優雅搜索包含可變框架,謝謝! – Backlin