5

当使用浏览器调试在多个级别调用其他函数的函数时,通常很难知道要进入哪个级别来检查特定变量。当函数包含apply, sapply,lapply调用产生中间级别时,它是神秘的。有没有办法在堆栈的所有级别上按名称搜索变量?

假设我有以下功能,在f3. 我会假设当进入第 5 级时,我应该能够以某种方式使用posorenvir参数列出我当前所在环境之上的任何环境的内容,但我不知道如何。例如,我该如何寻找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()
4

1 回答 1

5

list您在with中获取调用堆栈sys.frames。在这种情况下,如果您sys.framesbrowser开始后调用,您将获得list长度为 9 的 a。第 6-9 帧包括引发错误的调用和启动时涉及的调用browser(您可以通过调用 看到这一点sys.calls)。前五帧是显示在recover打印的调用堆栈中的帧。一旦browser开始,您可以在示例中查看调用堆栈的每个级别的名称空间

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

或搜索包含变量的框架

which(sapply(sys.frames(), function(frame) 'v2' %in% ls(frame)))
于 2013-06-26T12:18:01.407 回答