使用浏览器时搜索调用堆栈中的对象

时间:2013-06-26 11:53:43

标签: r debugging

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

假设我有以下函数,在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()

1 个答案:

答案 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)))