[R] Flattening lists and environments (was: "how to flatten a list to the same level?")

From: Janko Thyson <janko.thyson.rstuff_at_googlemail.com>
Date: Thu, 19 May 2011 22:40:44 +0200

Dear list,

I came up with a two functions that flatten arbitrary deeply nested lists (as long as they're named; not tested for unnamed) and environments (see attachment; 'flatten_examples.txt' contains some examples).

The paradigm is somewhat similar to that implemented in 'unlist()', yet extends it. I would have very much liked to build upon the superfast functionality of 'unlist()', but there are some obstacles to this (see these two related posts at r-devel from today: https://stat.ethz.ch/pipermail/r-devel/2011-May/061070.html and https://stat.ethz.ch/pipermail/r-devel/2011-May/061071.html).

Therefore, I had to use a recursive looping paradigm. Yet, if anyone has some suggestions on how to speed things up (maybe some Rcpp-people feel "called upon"?!? ;-)), I'd appreciate any pointers. Yet I do hope that what I came up with is at least of some value for those that posted similar questions on how to flexibly flatten nested objects in the past (that's why I'm also referring to this older post below; I also build upon the code provided by Henrique Dallazuanna and Mark Heckmann).

Best regards,
Janko

PS: Maybe this should rather go into a blog-post, but I don't have one yet ;-)

On 19.05.2011 22:16, Janko Thyson wrote:
> From: Mark Heckmann <mark.heckmann_at_gmx.de
> <mailto:mark.heckmann_at_gmx.de?Subject=Re:%20[R]%20how%20to%20flatten%20a%20list%20to%20the%20same%20level?>>
>
> Date: Sat, 09 Jan 2010 13:49:15 +0100
>
> Henrique,
>
> thanks for the code!! It works out fine for vectors. I forgot to
> mention I also have dataframes as list elements. Thus I want the
> structure of the list element to be kept intact.
>
> I tried an recursive approach (which unfortunately resulted in some
> more code) which works.
>
> .getNonListElements <- function(x, env){
>
> if(class(x)=="list") {
> for(i in seq(along=x)) .getNonListElements(x[[i]], env) # call
> recursively
> } else {
> res<- get("res", envir = env) # get res from other env
> res<- c(res, list(x)) # add one list element
> assign("res", res, envir=env) # assign back to env
> }
>
> }
>
> flattenList <- function(l){
>
> res<- list() # make list object
> env<- environment() # get current env
> .getNonListElements(l, env) # search for non list elements recursively
> return(res)
>
> }
>
> l <- list(DF=data.frame(A=c(1,2)), vec=c("a", "b")) l <- list(l,l)
>
> > flattenList(l)
>
> [[1]]
>
> A
> 1 1
> 2 2
>
> [[2]]
> [1] "a" "b"
>
> [[3]]
>
> A
> 1 1
> 2 2
>
> [[4]]
> [1] "a" "b"
>
> I am not sure if one can avoid the wrapper function or still use
> rapply to simplify the code. I do not know how. One more thing I would
> like to add are the objects names to the generated list. But I did not
> succeed in that.
>
> Mark
>
> Am 08.01.2010 um 18:29 schrieb Henrique Dallazuanna:
>
> > Try something about like this:
> >
> > split(unlist(l), rep(1:length(idx<- rapply(l, length)), idx))
> >
> > On Fri, Jan 8, 2010 at 1:35 PM, Mark Heckmann<mark.heckmann_at_gmx.de>
> > wrote:
> >> I have a nested list l like:
> >>
> >> l<- list(A=c(1,2,3), B=c("a", "b"))
> >> l<- list(l,l, list(l,l))
> >>
> >> I want the list to be unlisted, but not on the lowest level of each
> >> "branch".
> >> I want the lowest level of each list branch to remain as it is.
> >> So unlist or unlist(rec=F) do not work here as the level of nesting
> >> may
> >> differ on the elements.
> >> The result should look like:
> >>
> >> $A
> >> [1] 1 2 3
> >>
> >> $B
> >> [1] "a" "b"
> >>
> >> $A
> >> [1] 1 2 3
> >>
> >> $B
> >> [1] "a" "b"
> >>
> >> $A
> >> [1] 1 2 3
> >>
> >> $B
> >> [1] "a" "b"
> >>
> >> $A
> >> [1] 1 2 3
> >>
> >> $B
> >> [1] "a" "b"
> >>
> >> Any ideas?
> >> TIA!
> >>
> >> Mark
> >>
> >>
> >> ------------------------------------------------------------------------------
> >> Mark Heckmann
> >> Dipl. Wirt.-Ing. cand. Psych.
> >> Vorstraße 93 B01
> >> 28359 Bremen
> >> Blog:www.markheckmann.de
> >> R-Blog:http://ryouready.wordpress.com
> >>
> >> ______________________________________________
> >> R-help_at_r-project.org mailing list
> >> https://stat.ethz.ch/mailman/listinfo/r-help
> >> PLEASE do read the posting guidehttp://www.R-project.org/posting-guide.html
> >> and provide commented, minimal, self-contained, reproducible code.
> >>
> >
> >
> >
> > --
> > Henrique Dallazuanna
> > Curitiba-Paraná-Brasil
> > 25° 25' 40" S 49° 16' 22" O
>
> ------------------------------------------------------------------------------
>
> Mark Heckmann
> Dipl. Wirt.-Ing. cand. Psych.
> Vorstraße 93 B01
> 28359 Bremen
> Blog: www.markheckmann.de
> R-Blog: http://ryouready.wordpress.com
> --
> ------------------------------------------------------------------------
>
> *Janko Thyson*
> janko.thyson_at_ku-eichstaett.de <mailto:janko.thyson_at_ku-eichstaett.de>
>
> Catholic University of Eichstätt-Ingolstadt
> Ingolstadt School of Management
> Statistics and Quantitative Methods
> Auf der Schanz 49
> D-85049 Ingolstadt
>
> www.wfi.edu/lsqm <http://www.wfi.edu/lsqm>
>
> Fon: +49 841 937-1923
> Fax: +49 841 937-1965
>
> This e-mail and any attachment is for authorized use by the intended
> recipient(s) only. It may contain proprietary material, confidential
> information and/or be subject to legal privilege. It should not be
> copied, disclosed to, retained or used by any other party.
> If you are not an intended recipient then please promptly delete this
> e-mail and any attachment and all copies and inform the sender.
>

-- 
------------------------------------------------------------------------

*Janko Thyson*
janko.thyson_at_googlemail.com <mailto:janko.thyson_at_googlemail.com>

Jesuitenstraße 3
D-85049 Ingolstadt

Mobile: +49 (0)176 83294257

This e-mail and any attachment is for authorized use by the intended
recipient(s) only. It may contain proprietary material, confidential
information and/or be subject to legal privilege. It should not be
copied, disclosed to, retained or used by any other party.
If you are not an intended recipient then please promptly delete this
e-mail and any attachment and all copies and inform the sender.



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

Received on Thu 19 May 2011 - 20:43:29 GMT

This quarter's messages: by month, or sorted: [ by date ] [ by thread ] [ by subject ] [ by author ]

All messages

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Thu 19 May 2011 - 22:00:09 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive