2012-03-21 26 views
14

当调试一个函数时,我想移动到父框架并查看一些变量。我该怎么做呢?向上移动一帧,调试R环境

下面是一个示例:

f <- function() { 
    x <-1 
    g(x+1) 
} 
g <- function(z) { 
    y = z+2 
    return(y) 
} 

我然后调试使用debug("g")debug("f")两种功能。当我在gBrowser>处结束时,我想回到f来检查x。

由于

回答

11

就R术语,你想要调查g()的评估环境的父帧(即,其中g被称为环境)。 ?sys.parent的帮助页中记录了这样做的功能。

一旦您的浏览器显示您是'debugging in g(x + 1)',您可以执行以下操作。 (感谢约书亚乌尔里希的建议where,以帮助找到那些在调用堆栈中的位置。)

# Confirm that you are where you think you are 
where 
# where 1 at #3: g(x + 1) 
# where 2: f() 

# Get a reference to g()'s parent frame (an environment object) 
pframe <- parent.frame() 
pframe 
# <environment: 0x019b9174> 

# Examine the contents of the parent frame 
ls(env=pframe) 
# [1] "x" 

# Get the value of 'x' in the parent frame 
get("x", env = pframe) 
# [1] 1 

编辑:了解在?sys.parent描述的功能的集合,它可能是值得注意的是,parent.frame()是(基本上)速记sys.frame(sys.parent(1))。如果您发现自己处于调用堆栈更远的评估环境中(例如,where),则可以通过parent.frame(2)sys.frame(sys.parent(2))访问进一步备份调用堆栈的环境(比如向上两步)。

+4

在浏览器中键入'where'似乎有助于确定您需要返回多少帧。 – 2012-03-21 03:30:05

+0

感谢@Joshua对此非常有用的建议。我从你的评论中直接抓住了它,并将其粘贴在代码块的顶部。 – 2012-03-21 03:39:20

+0

谢谢大家的出色答案。 – Alex 2012-03-21 04:11:34

24

您可以使用recover (它往往是通过 使用options(error=utils::recover)调试代码的实际错误后, 但它可以直接调用)。

> f() 
debugging in: g(x + 1) 
debug at #1: { 
    y = z + 2 
    return(y) 
} 
Browse[2]> ls() 
[1] "z" 
Browse[2]> recover() 

Enter a frame number, or 0 to exit 

1: f() 
2: #3: g(x + 1) 

Selection: 1 
Called from: top level 
Browse[3]> ls() 
[1] "x" 
Browse[3]> x 
[1] 1 
Browse[3]> 
+3

非常酷。我从来没有想过可以交互式地调用recover()。有时候,我想我应该坐下来看看其余的人回答所有的问题,而这种宝石正是为什么。 – 2012-03-21 03:54:17

+1

太好了,谢谢你..非常有用。 – Alex 2012-03-21 04:11:51