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

From: Charilaos Skiadas <cskiadas_at_gmail.com>
Date: Thu, 3 Jan 2008 18:58:25 -0500

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



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. Received on Fri 04 Jan 2008 - 00:02:52 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Fri 04 Jan 2008 - 06:30:04 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive