Am 22.10.2015 um 19:05 schrieb Duncan Murdoch <murdoch.duncan at gmail.com <mailto:murdoch.duncan at gmail.com>>:
On 22/10/2015 10:20 AM,david.kaethner at gmail.com <mailto:david.kaethner at gmail.com>wrote:
Hello,
I?m trying to solve an exercise, where I want to walk through the search path recursively (http://adv-r.had.co.nz/Environments.html<http://adv-r.had.co.nz/Environments.html>).
I?m puzzled by a certain behavior and hope somebody can give me an explanation.
This code works:
listenv <- function(env = parent.frame()) {
if (identical(env, emptyenv())) {
#stop("reached emptyenv", call. = FALSE)
return(env)
} else {
print(env)
listenv(parent.env(env))
}
}
Here, the calling environment is determined with a default parameter in the function?s formals.
However, if I want to assign the calling environment within the function?s body, I get the error message ?infinite recursion?. Also, I never get actual environments (with attributes, that is), only memory addresses like this: <environment: 0x10da46630>.
I'm not sure what you were looking for, but "<environment: 0x10da46630>"
is the normal way to print an environment, unless it happens to be one
of the special named ones (like .GlobalEnv).
listenv <- function(env) {
env <- parent.frame()
if (identical(env, emptyenv())) {
#stop("reached emptyenv", call. = FALSE)
return(env)
} else {
print(env)
listenv(parent.env(env))
}
}
Any explanation of what?s going on here would be greatly appreciated. I suspect it has to do with when exactly the parent.frame()-expression is evaluated, but that?s not an actual explanation.
Your function completely ignores the "env" argument. It never recurses.
In the first case, "parent.frame()" is only a default value, so
recursion happens properly. If you change the first line in the body to
these two lines
if (missing(env))
env <- parent.frame()
it would be equivalent.
Duncan Murdoch