[R] applying a function recursively
Gabor Grothendieck
ggrothendieck at gmail.com
Thu Jun 12 15:14:17 CEST 2008
Wrap each element in an environment, flatten that and then
extact the element in each environment. (Be sure not to use
an old version of R since sufficiently far back R had a bug when
environments were stored in lists that was since fixed.)
L <- rapply(test.list, function(el) environment(), how = "unlist")
lapply(L, "[[", "el")
Alternately use proto objects (http://r-proto.googlecode.com):
library(proto)
L <- rapply(test.list, function(el) proto(, el = el), how = "unlist")
lapply(L, "[[", "el")
On Thu, Jun 12, 2008 at 7:11 AM, Georg Otto <georg.otto at tuebingen.mpg.de> wrote:
>
> Hi,
>
> thanks a lot for your help. Somehow rapply had escaped my notice. I
> also have a follow-up question on that. I would like to "flatten" my
> output list to a list with only one level. Option "unlist" in rapply
> returns a character vector, in my example:
>
>> rapply(test.list, rev, how="unlist")
> I.A1 I.A2 I.A3 I.B1 I.B2 I.B3 I.C1 I.C2 I.C3 II.A.a1
> "c" "b" "a" "f" "e" "d" "i" "h" "g" "c"
> II.A.a2 II.A.a3 II.A.b1 II.A.b2 II.A.b3 II.A.c1 II.A.c2 II.A.c3 II.B1 II.B2
> "b" "a" "f" "e" "d" "i" "h" "g" "f" "e"
> II.B3 II.C1 II.C2 II.C3
> "d" "i" "h" "g"
>
>
> What I rather would like to achieve is a list like this:
>
>
> $I.A
> [1] "c" "b" "a"
>
> $I.B
> [1] "f" "e" "d"
>
> $I.C
> [1] "i" "h" "g"
>
>
> $II.A.a
> [1] "c" "b" "a"
>
> $II.A.b
> [1] "f" "e" "d"
>
> $II.A.c
> [1] "i" "h" "g"
>
>
> $II.B
> [1] "f" "e" "d"
>
> $II.C
> [1] "i" "h" "g"
>
>
> Any hint will be appreciated.
>
> Best,
>
> Georg
>
>
>
>
> Prof Brian Ripley <ripley at stats.ox.ac.uk> writes:
>
>> See ?rapply
>>
>> On Wed, 11 Jun 2008, Georg Otto wrote:
>>
>>>
>>> Hi,
>>>
>>> I have a question about applying a function recursively through a
>>> list. Suppose I have a list where the different elements have
>>> different levels of recursion:
>>>
>>>
>>>> test.list<-list("I"=list("A"=c("a", "b", "c"), "B"=c("d", "e", "f"), "C"=c("g", "h", "i")),
>>> + "II"=list("A"=list("a"=c("a", "b", "c"), "b"=c("d", "e", "f"),
>>> + "c"=c("g", "h", "i")),
>>> + "B"=c("d", "e", "f"), "C"=c("g", "h", "i")))
>>>
>>>> test.list
>>> $I
>>> $I$A
>>> [1] "a" "b" "c"
>>>
>>> $I$B
>>> [1] "d" "e" "f"
>>>
>>> $I$C
>>> [1] "g" "h" "i"
>>>
>>>
>>> $II
>>> $II$A
>>> $II$A$a
>>> [1] "a" "b" "c"
>>>
>>> $II$A$b
>>> [1] "d" "e" "f"
>>>
>>> $II$A$c
>>> [1] "g" "h" "i"
>>>
>>>
>>> $II$B
>>> [1] "d" "e" "f"
>>>
>>> $II$C
>>> [1] "g" "h" "i"
>>>
>>>
>>>
>>> I would like to apply a function recursively to that list, in a way
>>> that the function does someting with each vector (eg. rev()) and
>>> returns a list of modified vectors that has the same structure as the
>>> input list, in my example:
>>>
>>>
>>> $I
>>> $I$A
>>> [1] "c" "b" "a"
>>>
>>> $I$B
>>> [1] "f" "e" "d"
>>>
>>> $I$C
>>> [1] "i" "h" "g"
>>>
>>>
>>> $II
>>> $II$A
>>> $II$A$a
>>> [1] "c" "b" "a"
>>>
>>> $II$A$b
>>> [1] "f" "e" "d"
>>>
>>> $II$A$c
>>> [1] "i" "h" "g"
>>>
>>>
>>> $II$B
>>> [1] "f" "e" "d"
>>>
>>> $II$C
>>> [1] "i" "h" "g"
>>>
>>>
>>>
>>> I understand that with a fixed number of recursion levels one can use
>>> lapply() in a nested way, but what if the numbers of recursion levels
>>> is not fixed or is different between the list elements as it is in my
>>> example?
>>>
>>> Any hint will be appreciated.
>>>
>>> Best,
>>>
>>> Georg
>>>
>>> ______________________________________________
>>> 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.
>>>
>>
>> --
>> Brian D. Ripley, ripley at stats.ox.ac.uk
>> Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
>> University of Oxford, Tel: +44 1865 272861 (self)
>> 1 South Parks Road, +44 1865 272866 (PA)
>> Oxford OX1 3TG, UK Fax: +44 1865 272595
>>
>> ______________________________________________
>> 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