# Re: [R] applying a function recursively

From: Georg Otto <georg.otto_at_tuebingen.mpg.de>
Date: Thu, 12 Jun 2008 13:11:00 +0200

Hi,

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