> You seem to have ignored my explanation. True, sorry. Thanks for sticking with me. Making sense now.
> > Duncan Murdoch > >> >> >>> Am 22.10.2015 um 19:05 schrieb Duncan Murdoch <murdoch.dun...@gmail.com >>> <mailto:murdoch.dun...@gmail.com>>: >>> >>> On 22/10/2015 10:20 AM,david.kaeth...@gmail.com >>> <mailto:david.kaeth...@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 >> > ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.