Janko Thyson
2011-May-19 20:40 UTC
[R] Flattening lists and environments (was: "how to flatten a list to the same level?")
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. -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: envirAsList.txt URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20110519/81044464/attachment.txt> -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: flatten.txt URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20110519/81044464/attachment-0001.txt> -------------- next part -------------- An embedded and charset-unspecified text was scrubbed... Name: flatten_examples.txt URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20110519/81044464/attachment-0002.txt>
Possibly Parallel Threads
- Function "nsl()" missing in package utils
- Feature request: extend functionality of 'unlist()' by args 'delim=c("/", "_", etc.)' and 'keep.special=TRUE/FALSE'
- Can an object reference itself?
- Problems building own package (Error: "package has been build before R-2.10.0")
- Problems building own package (Error: "package has been build before R-2.10.0")