[Rd] as(object,"list") as(object,"matrix") differences?
Wolski
wolski at molgen.mpg.de
Wed Sep 8 12:19:02 CEST 2004
Hi!
Some follow up questions concerning the class definition of list.
On 9/7/2004 at 11:47 AM John Chambers wrote:
>>>
>>>as(object, "list") works like all coercion to basic datatypes. The
>>>method uses the corresponding old-style as.<class> function. In
>>>addition, if coercion is strict, all attributes are removed. See ?as.
>>>
>>>The effect of this is that names would be removed, unless you used
>>>as(object, "list", strict=FALSE). (The coerce in dispatching methods is
>>>NOT strict, so a method for class "list" would see the names.)
>>>
setClass("Mlist"
,representation(info="character") #uniq names have to be unique?
,contains="list"
,prototype(uniq=FALSE)
)
tmp <- as.list(1:10)
names(tmp) <- letters[1:10]
mylist<-new("Mlist" , tmp , content="numeric" ,uniq=FALSE)
as.list(tmp) #preserves names
as.list(tmp,strict=TRUE) #preserves names
In both cases R preserves the names attribute! So it seems to me that current R's list definition includes the names attribute.
But
as(mylist,"list") #names are gone.
does not.
>>>datatype. The green book and S-Plus take the view that lists are just
>>>vectors, and the current R implementation follows that interpretation.
are "as.list" as it is, is deprecated?
Eryk
*********** REPLY SEPARATOR ***********
>>>Yes, there are differences, and you should expect some.
>>>
>>>That as(object, "matrix") preserves dimnames is hardly an accident,
>>>since dimnames are part of the definition of a matrix.
>>>
>>>as(object, "list") works like all coercion to basic datatypes. The
>>>method uses the corresponding old-style as.<class> function. In
>>>addition, if coercion is strict, all attributes are removed. See ?as.
>>>
>>>The effect of this is that names would be removed, unless you used
>>>as(object, "list", strict=FALSE). (The coerce in dispatching methods is
>>>NOT strict, so a method for class "list" would see the names.)
>>>
>>>This is consistent behavior, but yes, the elimination of names may be
>>>surprising. It's possible that future versions might treat names
>>>differently from other attributes, but there would need to be a strong
>>>argument.
>>>
>>>The workaround is to define a new class that trivially extends "list",
>>>and then define classes to extend that instead:
>>>
>>> setClass("listWithNames", "list")
>>>
>>>Then if x is an object from a class defined with
>>>contains="listWithNames", rather than contains="list",
>>> as(x, "listWithNames")
>>>would preserve names.
>>>
>>>The problem here is that the definition of class (or dataype) "list" was
>>>never very clear as to whether names were an attribute or part of the
>>>datatype. The green book and S-Plus take the view that lists are just
>>>vectors, and the current R implementation follows that interpretation.
>>>
>>>(There is also in S-Plus a different class, "named", specifically for
>>>the applications that lists with names typically deal with. But the
>>>spirit of that class is NOT equivalent to lists with a names attribute.)
>>>
>>>As for extending basic datatypes by S4 classes, that's generally OK,
>>>provided you understand the consequences (pages 314-316 of the green
>>>book have a brief discussion).
>>>
>>>And as for "wrapper" classes, there are no immediate plans. The basic
>>>datatypes do have class definitions:
>>>
>>>R> getClass("list")
>>>
>>>No Slots, prototype of class "list"
>>>
>>>Extends: "vector"
>>>
>>>The main candidates for wrapper classes are "matrix" and "array", since
>>>these do not have a fixed set of attributes (they may or may not have
>>>"dimnames"). Class "ts" is already a formal class.
>>>
>>>John Chambers
>>>
>>>Wolski wrote:
>>>>
>>>> Hello!
>>>>
>>>> as(object,"list") and as(object,"matrix") behave quite differently if
>>>it comes to their attributes.
>>>> I define two classes. One of them "contains" a "list" the other a
>>>"matrix"
>>>> setClass("myclass"
>>>> ,representation(info="character")
>>>> ,contains="matrix"
>>>> )
>>>> setClass("mylist"
>>>> ,representation(info="character")
>>>> ,contains="list"
>>>> )
>>>>
>>>> #init
>>>> dd<-matrix(1:6,nrow=2)
>>>> rownames(dd)<-c("a","b")
>>>> tt<-new("myclass",dd)
>>>>
>>>> tmp<-vector("list",4)
>>>> names(tmp)<-1:4
>>>> ll <- new("mylist",tmp,info="foo")
>>>>
>>>> rownames(tt)
>>>> [1] "a" "b"
>>>> > rownames(as(tt,"matrix"))
>>>> [1] "a" "b"
>>>>
>>>> > names(ll)
>>>> [1] "1" "2" "3" "4"
>>>> > names(as(ll,"list"))
>>>> NULL
>>>> #but
>>>> names(ll at .Data)
>>>> The difference in behaviour to which i would like to point your
>>>attention is that as(object,"matrix") preserves the "dimnames" but at
>>>the same time as(object,"list") drops the "names" attribute.
>>>>
>>>> Is it recomended not to use "contains" with old style classes?
>>>> Are there plans to provide standarized S4 versions/wrappers for list,
>>>matrix etc... classes?
>>>>
>>>> /E
>>>>
>>>> PS.
>>>> R : Copyright 2004, The R Foundation for Statistical Computing
>>>> Version 1.9.1 Patched (2004-08-30), ISBN 3-900051-00-3
>>>>
>>>> ______________________________________________
>>>> R-devel at stat.math.ethz.ch mailing list
>>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>--
>>>John M. Chambers jmc at bell-labs.com
>>>Bell Labs, Lucent Technologies office: (908)582-2681
>>>700 Mountain Avenue, Room 2C-282 fax: (908)582-3340
>>>Murray Hill, NJ 07974 web: http://www.cs.bell-labs.com/~jmc
Dipl. bio-chem. Witold Eryk Wolski @ MPI-Moleculare Genetic
Ihnestrasse 63-73 14195 Berlin 'v'
tel: 0049-30-83875219 / \
mail: witek96 at users.sourceforge.net ---W-W---- http://www.molgen.mpg.de/~wolski
wolski at molgen.mpg.de
More information about the R-devel
mailing list