Brian Diggs <brian.s.di...@gmail.com> writes: > On 1/16/15 9:34 AM, Bert Gunter wrote: >> Chee Hee's approach is both simpler and almost surely more efficient, >> but I wanted to show another that walks the tree (i.e. the list) >> directly using recursion at the R level to pull out the desired >> components. This is in keeping with R's "functional" programming >> paradigm and avoids the use of regular expressions to extract the >> desired components from the unlist() version. >> >> extr <- function(x,nm){ >> if(is.recursive(x)){ >> wh <- names(x) %in% nm >> c(x[wh],lapply(x[!wh],extr,nm=nm) ) >> } else NULL >> } >> >> ## The return value contains a bunch of NULLs; so use unlist() to remove them >> >>> unlist(extr(x,"A")) >> f1.x1.A f1.x2.A f2.x3.A f2.x4.A >> 11 12 13 14 >> >> >> I would welcome any possibly "slicker" versions of the above. > > I don't know if you would consider this "slicker" or not, but it does > not give a lot of NULLs that have to be filtered out. It does so by > checking if the component of the list is itself a list before > recursively calling extr on it, and by using unlist internally. > > extr <- function(x, nm) { > if(is.list(x)) { > sublists <- sapply(x, is.list) > c(unlist(x[nm]), unlist(sapply(x[sublists], extr, nm))) > } else { > message("Argument is not a list") > NULL > } > } > > Running it on x gives > >> extr(x, "A") > [1] 11 12 13 14 >
It indeed eliminates the NULLs - but calling the unlist in the recursion, could be inefficient again. But benchmarks would be needed to see if this is the case. But I am reallywondering that there is nothing available to do this easily. I might look into this when I have some time. Thanks everybody, Rainer > >> Cheers, >> Bert >> >> Bert Gunter >> Genentech Nonclinical Biostatistics >> (650) 467-7374 >> >> "Data is not information. Information is not knowledge. And knowledge >> is certainly not wisdom." >> Clifford Stoll >> >> >> >> >> On Fri, Jan 16, 2015 at 7:23 AM, Chel Hee Lee <chl...@mail.usask.ca> wrote: >>> This approach may not be fancy as what you are looking for. >>> >>>> xl <- unlist(x) >>>> xl[grep("A", names(xl))] >>> f1.x1.A f1.x2.A f2.x3.A f2.x4.A >>> 11 12 13 14 >>>> >>> >>> I hope this helps. >>> >>> Chel Hee Lee >>> >>> On 01/16/2015 04:40 AM, Rainer M Krug wrote: >>>> >>>> Hi >>>> >>>> Consider the following variable: >>>> >>>> --8<---------------cut here---------------start------------->8--- >>>> x1 <- list( >>>> A = 11, >>>> B = 21, >>>> C = 31 >>>> ) >>>> >>>> x2 <- list( >>>> A = 12, >>>> B = 22, >>>> C = 32 >>>> ) >>>> >>>> x3 <- list( >>>> A = 13, >>>> B = 23, >>>> C = 33 >>>> ) >>>> >>>> x4 <- list( >>>> A = 14, >>>> B = 24, >>>> C = 34 >>>> ) >>>> >>>> y1 <- list( >>>> x1 = x1, >>>> x2 = x2 >>>> ) >>>> >>>> y2 <- list( >>>> x3 = x3, >>>> x4 = x4 >>>> ) >>>> >>>> x <- list( >>>> f1 = y1, >>>> f2 = y2 >>>> ) >>>> --8<---------------cut here---------------end--------------->8--- >>>> >>>> >>>> To extract all fields named "A" from y1, I can do >>>> >>>> ,---- >>>> | > sapply(y1, "[[", "A") >>>> | x1 x2 >>>> | 11 12 >>>> `---- >>>> >>>> But how can I do the same for x? >>>> >>>> I could put an sapply into an sapply, but this would be less then >>>> elegant. >>>> >>>> Is there an easier way of doing this? >>>> >>>> Thanks, >>>> >>>> Rainer > -- Rainer M. Krug email: Rainer<at>krugs<dot>de PGP: 0x0F52F982
signature.asc
Description: PGP signature
______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.