2013-06-26 16 views
5

Hata ayıklama işlevleri, tarayıcıyı kullanarak birçok düzeyde başka işlevleri çağırırken, belirli bir değişkeni denetlemek için hangi seviyenin girileceğini bilmek genellikle zordur. İşlevler, apply, sapply, lapply, orta düzeyler üretmeyi çağırdığında şifrelenir. Yığın tüm düzeylerinde bir ada göre değişken aramak için bir yolu var mı?Tarayıcıyı kullanırken arama yığındaki nesnelerin aranması

Aşağıdaki işlevleri yerine getirdiğimi varsayalım, f3 içinde bir hata oluştu. Seviye 5'e girerken, şu an içinde bulunduğumdan herhangi bir ortamın içeriğini, bir şekilde pos veya envir argümanını kullanarak listeleyebilmem gerekir, ama nasıl olduğunu anlayamıyorum. Örneğin, v2'u nasıl arayabilirim?

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() 

cevap

5

Sen sys.frames ile list yılında çağrı yığını elde ederiz. Bu durumda, browser başladıktan sonra sys.frames'u çağırırsanız, bir list uzunluğu 9 alırsınız. Çerçeveler 6-9, hatayı ve browser'u başlatma ile ilgili çağrıları içerir (bunu sys.calls numaralı telefonu arayarak görebilirsiniz)). İlk beş kare, çağrı yığınında görüntülenenler recover baskılarıdır. browser başladıktan sonra,

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

ile örnekteki çağrı yığını her seviyenin ad bakabilirsiniz ya

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

Çok zarif ile değişkeni içeren çerçeveyi aramak, teşekkür ederim! – Backlin

İlgili konular