当使用浏览器调试在多个级别调用其他函数的函数时,通常很难知道要检查特定变量的级别。当函数包含生成中间级别的apply
,sapply
,lapply
调用时,它是神秘的。有没有办法在堆栈的所有级别上按名称搜索变量?
假设我有以下函数,在f3
中产生错误。我假设当进入第5级时,我应该能够以某种方式使用pos
或envir
参数列出我当前所在环境中任何环境的内容,但我可以'弄清楚如何。我怎样才能找到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()
答案 0 :(得分:5)
您使用list
获取sys.frames
中的callstack。在这种情况下,如果您在sys.frames
启动后调用browser
,则会得到list
长度为9.帧6-9包括引发错误的调用以及涉及的调用在启动browser
时(您可以通过调用sys.calls
来查看)。前五个帧是recover
打印的调用堆栈中显示的帧。启动browser
后,您可以使用
lapply(sys.frames()[1:5], ls)
或使用
搜索包含变量的框架which(sapply(sys.frames(), function(frame) 'v2' %in% ls(frame)))