On Tue, 13 Nov 2007, John Chambers wrote: > What's the proposal here? To eliminate "double" as a class? No objection
Eliminate "double" and "single". > from this corner. As I remember, it was put in early in the implementation > of methods, when I was confused about what R intended in this area (well, I'm > not totally unconfused even now). > > If this is the proposal, we could implement it in r-devel and see if there > are complaints. I was going to propose so after running some tests over CRAN/BioC (which will take a few hours). Brian > Prof Brian Ripley wrote: >> On Tue, 13 Nov 2007, Simon Urbanek wrote: >> >> >>> On Nov 13, 2007, at 3:36 AM, [EMAIL PROTECTED] wrote: >>> >>> >>>> Any idea why S4 doesn't allow slots of type "double"? >>>> >>>> >>> Type (as in storage type and "double" is a storage type) has nothing >>> to do with classes. You cannot create slots for types, only for classes. >>> >> >> Unfortunately not in the world of the 'methods' package (which seems to >> differ here from the Green Book and S-PLUS). There's a basic class >> "double" (and also "single") defined in BasicClasses.R. It say: >> >> >>> getClass("double") >>> >> >> No Slots, prototype of class "numeric" >> >> Extends: "vector", "numeric" >> >> >>> getClass("numeric") >>> >> >> No Slots, prototype of class "numeric" >> >> Extends: "vector" >> >> Known Subclasses: "double", "integer" >> >> So it is an otherwise unspecified subclass of "numeric". >> >> Now when you do >> >> >>> a <- new("numeric", pi) >>> a >>> >> [1] 3.141593 >> >>> class(a) >>> >> [1] "numeric" >> >> you are in fact calling class() on a REALSXP, and that is set up to report >> "numeric" (the implicit class comes from mode not type, except for >> "integer"). >> >> Anther area of confusion is that as.numeric, as.double and as.real are >> three names for the same thing, but is.numeric and is.double are not the >> same. So we end up with >> >> >>> x <- 1:3 >>> is.numeric(x) >>> >> [1] TRUE >> >>> identical(x, as.numeric(x)) >>> >> [1] FALSE >> >>> x <- pi >>> is.numeric(x) >>> >> [1] TRUE >> >>> identical(x, as.numeric(x)) >>> >> [1] TRUE >> >> Basically I think class() is wrong (it should use "double"), but it was not >> my choice and it was presumably done to agree with the Green Book. >> >> I agree that it would be best to remove the "double" and "single" S4 >> classes. At least in the version of S-PLUS I have left, "double" does not >> exist -- "single" does but is a distinct storage type. >> >> >> >>> >>>>> setClass("A", representation(a="double")) >>>>> >>>> Error in makePrototypeFromClassDef(properties, ClassDef, immediate, >>>> where) : >>>> in making the prototype for class "A" elements of the prototype >>>> failed to >>>> match the corresponding slot class: a (class ?double? ) >>>> >>>> "numeric", "integer", "character", "complex", "raw", etc... they all >>>> work but "double" doesn't. Any reason for this strange exception? >>>> >>>> >>> AFAICS there is no way to create an object of the class "double" (save >>> for 'faking' it by creating an informal S3 object), so such definition >>> is useless. And given this fact, even the internal code is unable to >>> create it, so it doesn't match the signature. Note: >>> >>> >>>> a=new("double") >>>> class(a) >>>> >>> [1] "numeric" >>> >>>> is(a,"double") >>>> >>> [1] FALSE >>> >>> I think it comes from the fact that there is an S4 definition for the >>> class "double" which is not valid. That is probably a bug and the >>> class definition should be removed. >>> >>> Cheers, >>> Simon >>> >>> ______________________________________________ >>> R-devel@r-project.org mailing list >>> https://stat.ethz.ch/mailman/listinfo/r-devel >>> >>> >> >> -- Brian D. Ripley, [EMAIL PROTECTED] Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595 ______________________________________________ R-devel@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel