[R] Suggestion on how to make permanent changes to a single object in a list?

Duncan Murdoch murdoch at stats.uwo.ca
Fri Jan 4 10:31:12 CET 2008


On 03/01/2008 5:58 PM, Peter Waltman wrote:
> Hi Gabor -
> 
> Thanks for the 2 suggestions (and to Charilaos Skiadas as well, who also 
> suggested looking at proto).
> 
> I think I'm leaning towards using the new environment idea you 
> suggested, however, I don't quite get what a promise is (beyond what the 
> help page says and I didn't really follow it).
> 
> Is there a single document describing the relationship between 
> environments, assignments, bindings, etc?  Unfortunately, I haven't been 
> able to find anything which gives a good overview of what these are and 
> how they interact. 

That sort of information would be in the R Language Definition manual, 
not R Intro.

Duncan Murdoch

> 
> Clearly, it's beyond the introduction to R document that you can find on 
> the website, and any books I've looked at focus on how to use R to 
> generate statistical results, rather than on the actual language 
> aspects.  Finally, while the help pages may explain the individual 
> functions, I find these difficult to use without understanding the 
> general framework in which they work.
> 
> Thanks,
> 
> Peter
> 
> Gabor Grothendieck wrote:
>> You can do it with environments.  The first line sets up fooStack with
>> a list of environments instead of a list of lists and the remaining lines
>> are the same as in your post squished to one line each to make it
>> easier to see the entire code at once:
>>
>> fooStack <- lapply(1:5, new.env)
>> fooModifier <- function( foo ) foo$bar <- "bar"
>> fooModifier( fooStack[[ 1 ]] )
>> fooStack[[1]]$bar # "bar"
>>
>> You may need to be a bit careful if you pursue this line of reasoning as there
>> is a long standing bug in R relating to lists of promises so take care that you
>> don't get promises in the list.  See point #2 in:
>> https://stat.ethz.ch/pipermail/r-devel/2008-January/047914.html
>>
>> Also you might want to look at the proto package which reframes the
>> use of environments in terms of object oriented programming.
>> http://r-proto.googlecode.com
>>
>>
>> On Jan 3, 2008 4:35 PM, Peter Waltman <waltman at cs.nyu.edu> wrote:
>>   
>>>   specifically, imagine we have:
>>>
>>>     fooStack <- list()
>>>     for ( i in 1:5 )
>>>         fooStack[[i]] <- list()
>>>
>>>   and we have a function:
>>>
>>>     fooModifier <- function( foo ) {
>>>
>>>     foo$bar <- "bar"
>>>
>>>     }
>>>
>>>   then, if we invoke fooModifier, i.e.:
>>>
>>>     fooModifier( fooStack[[ 1 ]] )
>>>
>>>   the $bar elt is only set in the scope of the function, and if we use the
>>>   "<<-" modifier in fooModifier, R will throw an error b/c it can't find the
>>>   "foo" object.  I have to say that for someone coming from languages that
>>>   have pointers and/or references, it's really frustrating that R fails to
>>>   allow one to have direct access to the objects' memory space.
>>>   Onyway, one workaround would be to pass in the whole fooStack object and the
>>>   index of the elt that you want to modify to the fooModifier fn, but I'd
>>>   rather not have to pass the whole thing in.
>>>   Any suggestions?
>>>   Thanks!
>>>   Peter Waltman
>>> ______________________________________________
>>> R-help at r-project.org mailing list
>>> 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.
>>>
>>>
> 
> ______________________________________________
> R-help at r-project.org mailing list
> 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.




More information about the R-help mailing list