2013-06-26 28 views
5

Khi chức năng gỡ lỗi gọi các chức năng khác ở nhiều cấp bằng trình duyệt, thường khó có thể biết mức độ nào cần nhập để kiểm tra biến cụ thể. Thật khó hiểu khi các hàm có chứa các số gọi hàm trung gian là apply, sapply, lapply. Có cách nào để tìm kiếm biến theo tên trên tất cả các cấp của ngăn xếp không?Tìm kiếm các đối tượng trong ngăn xếp cuộc gọi khi sử dụng trình duyệt

Giả sử tôi có các chức năng bên dưới, tạo ra lỗi trong f3. Tôi sẽ giả định rằng khi bước vào cấp 5 tôi sẽ có thể liệt kê các nội dung của bất kỳ môi trường nào bên trên môi trường tôi hiện đang sử dụng, bằng cách sử dụng đối số pos hoặc envir theo một cách nào đó, nhưng tôi không thể tìm ra cách. Làm thế nào tôi có thể tìm kiếm ví dụ 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() 

Trả lời

5

Bạn nhận được callstack theo số list với sys.frames. Trong trường hợp này, nếu bạn gọi sys.frames sau khi bắt đầu browser, bạn sẽ nhận được list chiều dài 9. Khung 6-9 bao gồm cuộc gọi đưa ra lỗi và các cuộc gọi liên quan đến việc bắt đầu browser (bạn có thể xem điều này bằng cách gọi sys.calls). Năm khung hình đầu tiên là những khung được hiển thị trong ngăn xếp cuộc gọi recover bản in. Khi browser bắt đầu, bạn có thể nhìn vào không gian tên của mỗi cấp độ của callstack trong ví dụ của bạn với

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

hoặc tìm kiếm các khung có chứa các biến với

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

Rất thanh lịch, cảm ơn bạn! – Backlin

Các vấn đề liên quan