[R] applying a function recursively

Georg Otto georg.otto at tuebingen.mpg.de
Thu Jun 12 13:11:00 CEST 2008


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



More information about the R-help mailing list