[Rd] slots of type "double"
Prof Brian Ripley
ripley at stats.ox.ac.uk
Tue Nov 13 19:19:02 CET 2007
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, hpages at fhcrc.org 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 at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>>
>>>
>>
>>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
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
More information about the R-devel
mailing list