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

Charilaos Skiadas cskiadas at gmail.com
Fri Jan 4 00:58:25 CET 2008


On Jan 3, 2008, at 5:08 PM, Bert Gunter wrote:

> Gentlemen:
>
> I'm sorry, I don't see the problem. R's is Lisp (or Scheme)- 
> inspired, so you
> need to think in terms of lists, or equivalently, trees. So what  
> you seem to
> want to do is easily navigate down a tree to modify a node. This is  
> fairly
> easy to do with list indexing:
>
> ## First create a tree with 5 top nodes each of which has 3 child  
> leaf nodes
>
> ## each of which is an empty list.
>
> fooStack<-lapply(1:5,function(x)lapply(1:3,function(x)list()))
>
> ## Now modify the <4,2> leaf list:
>
> fooStack[[c(4,2)]]$bar <- "bar"
> ## Note: This is shorthand for fooStack[[4]][[2]]$bar <- "bar"

But you want to do this inside a function, i.e. to have function  
that, when passed an argument which is a list, sets the "bar" item of  
this list to the string value "bar" (or perhaps something more  
complicated).

Probably the correct way to do this would be to do

fooStack[[1]]  <- fooModifier(fooStack[[1]])

But the OP was asking, effectively, if we can make it so that the <-  
part is not necessary. I have often found myself wanting to do this,  
and admittedly R, with its LISP functional programming inspiration,  
does not make this very easy.

I should point out here that my suggestion of using `fooModifier<-`  
was purely for showing the potential, I think it would be very bad  
form to actually use it (unless the "<- NULL" part is going to be  
used in the assignment somehow), since it does not use the value that  
it pretends to be assigning to things.

Peter, perhaps it would help if you gave us more context into why you  
wanted this done, and perhaps then someone can suggest a more natural  
approach. Perhaps there is a more "R" way to solve your original  
problem.

One gotcha if you use the proto package (which I do highly recommend,  
it is a wonderful package). I found that mysterious things happen if  
you name your proto object x:

 > library(proto)
 > x<-proto(y=5)
 > x$y
Error in get("y", env = x, inherits = TRUE) : invalid 'envir' argument

Took me a while to figure out that the problem was caused by naming  
the object x.

Haris Skiadas
Department of Mathematics and Computer Science
Hanover College




More information about the R-help mailing list