[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