# [R] Recursive function for lists

Martin Maechler maechler at stat.math.ethz.ch
Tue Jun 11 18:34:32 CEST 2002

```>>>>> "John" == John Fox <jfox at mcmaster.ca> writes:

John> Dear Eric, At 01:23 PM 6/10/2002 +0100, Eric Lecoutre
John> wrote:

>> Does it exist a function to recursively run through a
>> list and apply a function only to terminal nodes?  I
>> tried to sapply my HTML.list function to a list and
>> expected that it recursively worked but it's not the
>> case.

John> I have the feeling that I'm reinventing the wheel -- I
John> think that I recall a simple way to flatten a list but
John> I can't find it (or I may just be having a Lisp
John> flashback), and I don't think that anyone else has

unlist() is probably what you can't recall.
It is a bit different than your  flatten()  though :

> lst <- list(lst1=list(a=1:3, b=4:6), lst2=list(c=7:9, d=10:12), e=13:15)

> str(ul <- unlist(lst, recursive=FALSE))
List of 7
\$ lst1.a: int [1:3] 1 2 3
\$ lst1.b: int [1:3] 4 5 6
\$ lst2.c: int [1:3] 7 8 9
\$ lst2.d: int [1:3] 10 11 12
\$ e1    : int 13
\$ e2    : int 14
\$ e3    : int 15

John> In any event, here's a simple-minded function that
John> flattens a list, along with an example of its use.

>> > flatten <- function(x){
>> +     result <- NULL
>> +     for(i in seq(along=x)) {
>> +         if (any(sapply(x[[i]], is.list))) Recall(x[[i]])
>> +         else result <-
>> +	       	    c(result, if (is.list(x[[i]])) x[[i]] else list(x[[i]]))
>> +         }
>> +     return(result)
>> +     }
>> >
>> > lst <- list(lst1=list(a=1:3, b=4:6), lst2=list(c=7:9, d=10:12), e=13:15)
>> > flat <- flatten(lst)
>> > flat
>> \$a
>> [1] 1 2 3
>>
>> \$b
>> [1] 4 5 6
>>
>> \$c
>> [1] 7 8 9
>>
>> \$d
>> [1] 10 11 12
>>
>> [[5]]
>> [1] 13 14 15
>>
>> > sapply(flat, sum)
>> a  b  c  d
>> 6 15 24 33 42

>> Maybe this will help.
>>   John
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```