当调试一个函数时,我想移动到父框架并查看一些变量。我该怎么做呢?向上移动一帧,调试R环境
下面是一个示例:
f <- function() {
x <-1
g(x+1)
}
g <- function(z) {
y = z+2
return(y)
}
我然后调试使用debug("g")
和debug("f")
两种功能。当我在g
的Browser>
处结束时,我想回到f
来检查x。
由于
当调试一个函数时,我想移动到父框架并查看一些变量。我该怎么做呢?向上移动一帧,调试R环境
下面是一个示例:
f <- function() {
x <-1
g(x+1)
}
g <- function(z) {
y = z+2
return(y)
}
我然后调试使用debug("g")
和debug("f")
两种功能。当我在g
的Browser>
处结束时,我想回到f
来检查x。
由于
就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))
访问进一步备份调用堆栈的环境(比如向上两步)。
您可以使用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]>
非常酷。我从来没有想过可以交互式地调用recover()。有时候,我想我应该坐下来看看其余的人回答所有的问题,而这种宝石正是为什么。 – 2012-03-21 03:54:17
太好了,谢谢你..非常有用。 – Alex 2012-03-21 04:11:51
在浏览器中键入'where'似乎有助于确定您需要返回多少帧。 – 2012-03-21 03:30:05
感谢@Joshua对此非常有用的建议。我从你的评论中直接抓住了它,并将其粘贴在代码块的顶部。 – 2012-03-21 03:39:20
谢谢大家的出色答案。 – Alex 2012-03-21 04:11:34