Hi! First of all thanks a lot to John Chambers. I think S4 makes some tasks really easier. This mail tries to summarise the mail exchange concerning contains="list" in S4. I do not know all the R "internals" so instead of talking I try to use and to play around with S4. People like I learn by example. But I would like to use all features of S4. I dont say that anything is good or bad. I just ask on which parts and features can I rely on? About which parts of methods I be sure that there are not going to change in the nearest future? And making a search on several hundred packages in the lib directory, and finding that setAs is used only in the file methods/R-ex/as.R its not reassuring.
I like to use S4 and i like to use lists. I like to use lists like maps or multimaps with key value pairs. I believe that I am not the only one who uses lists to store different types of objects and to access them using mylist[["key"]]. So in my opinion list had have and should have names. (I am not a phyton user yet but I know that phyton has also a data structure to store key value pairs and it is a quite important one.) R provides a lot of powerfull functions which are operating on "lists" like sapply, lapply, mapply, [[]] [] etc.... And all the list methods lapply, [], etc preserve the list names. So if they "return a type" are "list" then list have names. But as I said i understand examples and so probably nothing new to what you have already said. And I think that my examples will show that even in S4 except for the function as(object,"list") old style "list" have names attribute. If I write a new class, and this class is a mainly a container class, I would like rather inherit from a list (contains="list") with names rather then include it (include means representation(list="list") like e.g. class Biobase:container does). I like to inherit because I would not like to wrap every possible list function which is available for lists. Its just because I even not know all of them. And if I have inheritance as a tool this is not neceassary. Any function working on lists can be used on a class inheriting from list. The following code summarizes, by example, how names are treated when "list" is "contained" by a class. I show 3 versions how to inherit from "list" showing the problems with the 'naive' inheritance. And I think that the example shows also that in S4 the old styl "list" class are with "names"! There are also some inconsistencies, bugs which I am going to show on occasion? #NAIVE inheritance from list. #define cass setClass("ListWithNames","list") setClass("Mlist" ,representation(info="character") #uniq names have to be unique? ,contains="ListWithNames" ,prototype(uniq=FALSE) ) tmp <- as.list(1:4) names(tmp) <- letters[1:4] mylist<-new("Mlist" , tmp , info="numeric" ) #Example of manipulating the list part of the object. as(mylist,"list")<-lapply(mylist,"+",3) as(mylist,"list") <- mylist[2:4] as(mylist,"list") <- as(mylist,"ListWithNames")[2:4] #what does not work is assigning shorter lists without names. Seems like a bug. Or is there an explanation. as(mylist,"list")<-as.list(1:5) as(mylist,"list")<-as.list(1:4) class(Mlist) #I have not defined in class Representation # a names attribute but there is the name attribute anyway inherited by from list. [EMAIL PROTECTED] # But this does not work. Of course. [EMAIL PROTECTED] <- letters[5:9] #Slots are implemented using attributes? attributes([EMAIL PROTECTED])$names #this is what is expected. attributes(mylist)$names #But whats this? attributes(mylist)$names <- letters[2:11] attributes([EMAIL PROTECTED])$names #are they the same? synchronized? # So if @names are there why not make it official ? # I make it official with a new class definition. # REFINED version of "list" inheritance. setClass("MlistN" ,representation(info="character",names="character") #uniq names have to be unique? ,contains="ListWithNames" ) mylistNam<-new("MlistN" , tmp , info="numeric") [EMAIL PROTECTED]<-letters[4:7] mylistNam["d"] mylistNam[["d"]] as(mylistNam,"list")<-tmp[1:3] as(mylistNam,"list")<-as.list(1:4) as(mylistNam,"list")<-as.list(1:3) #<- the same error as before. as(mylistNam,"list")<-list(a=1,b=2,c=3,d=4) #to get it more complicated as(mylistNam,"ListWithNames") # Is without names?? ## MORE REFINED version of list inheritance. setClass("MlistN" ,representation(info="character",names="character") #uniq names have to be unique? ,contains="list" ) # I dont like the as(o,"list") # My Solution. Now it does not mether wheter the list has or has not names is longer or shorter. setAs("MlistN","list" ,def=function(from){ print("test") to<[EMAIL PROTECTED] names(to)<[EMAIL PROTECTED] to } ,replace=function(from,value) { [EMAIL PROTECTED]<-value [EMAIL PROTECTED]<-names(value) from } ) bublegum <- list(b=1, u=3, b=4, l=4, e=2, g=1, u=4, m=2) mylistNam <- bublegum bubl<-bublegum[1:4] names(bubl)<-NULL as(mylistNam,"list") <- bubl I have just one question: Can I rely that this is not going to change in further versions of R? /E ______________________________________________ [EMAIL PROTECTED] mailing list https://stat.ethz.ch/mailman/listinfo/r-devel