[R] Unlisting while preserving object types?

Jim Lemon bitwrit at ozemail.com.au
Thu Oct 11 11:04:22 CEST 2001


"Turner, Jason" wrote:
> 
> ...The example I gave is a toy one, however, and I neglected to mention that I
> need it
> automated because the number of members (in the example, a and b) isn't
> known in
> advance, and could typically be as high as 30.  I got tired of typing it all
> out each time.
> Sorry I forgot the most crucial details - I keep forgetting that the whole
> world isn't
> working on this with me.  ;-)

> > >
> > >... I'm looking for an elegant way to fetch components of the sub-lists a
> > and b

I don't find unpacking lists straightforward, and use recursion when I
need a general solution. That is, to say, I test each component of a
list, and if it is another list, I call the function with the sublist.
At the bottom list, I apply the appropriate function and return the
transformed data. For a toy example...

# list2mat unpacks a list of vectors, possibly nested, and 
# returns a matrix whose columns are the vectors in the list.
# Note that the vectors in the list must all be the same length.

list2mat<-function(input.list) {
 firstname<-""
 for(l in 1:length(input.list)) {
  if(is.list(input.list[[l]])) {
   if(exists("newmat",inherits=F)) {
    if(nchar(firstname)) {
     tempnames<-firstname
     firstname<-""
    }
    else tempnames<-colnames(newmat)
    newmat<-cbind(newmat,list2mat(input.list[[l]]))
   }
   else {
    newmat<-list2mat(input.list[[l]])
    firstname<-names(input.list[l])
   }
  }
  else {
   if(exists("newmat",inherits=F)) {
    if(nchar(firstname)) {
     tempnames<-firstname
     firstname<-""
    }
    else tempnames<-colnames(newmat)
    newmat<-cbind(newmat,input.list[[l]])
    colnames(newmat)<-c(tempnames,names(input.list[l]))
   }
   else {
    newmat<-input.list[[l]]
    firstname<-names(input.list[l])
   }
  }
 }
 return(newmat)
}

> testlist<-list(a=1:5,b=2:6,c=list(d=3:7,e=c("a","b","c","d","e")))
> list2mat(testlist)

Jim

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



More information about the R-help mailing list