move up a frame, debug R environment

无人久伴 提交于 2020-01-30 16:03:11

问题


When debugging a function, I would like to move up to the parent frame and look at some variables there. How do I do this?

Here is a sample:

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

I then debug both functions using debug("g") and debug("f"). When I end up in g at the Browser>, I would like to move back up to f to examine x.

Thanks


回答1:


In R terminology, you are wanting to investigate the parent frame of g()'s evaluation environment (i.e. the environment in which g was called). The functions for doing that are documented in the help page for ?sys.parent.

Once your browser indicates that you are 'debugging in g(x + 1)', you can do the following. (Thanks to Joshua Ulrich for suggesting where to help locate ones position in the call stack .)

# 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

EDIT: To understand the collection of functions described in ?sys.parent, it's probably worth noting that parent.frame() is (basically) shorthand for sys.frame(sys.parent(1)). If you find yourself in an evaluation environment farther down a call stack (as revealed by where, for instance), you can reach into environments farther back up the call stack (say two steps up) by either parent.frame(2) or sys.frame(sys.parent(2)).




回答2:


You can use recover (it is often used to debug code after an actual error, via options(error=utils::recover), but it can be called directly).

> 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]> 


来源:https://stackoverflow.com/questions/9796843/move-up-a-frame-debug-r-environment

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!