[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