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

Reply via email to