On Wed, 12 Mar 2003, Torsten Hothorn wrote:
> 
> Hi,
> 
> I'm a little bit confused about the class of integers (with yesterdays
> r-devel):
> 
> R> a <- 1:10
> R> class(a)
> [1] "integer"
> R> inherits(a, "integer")
> [1] FALSE
> R> data.class(a)
> [1] "numeric"
> R> is.numeric(a)
> [1] TRUE
> R> inherits(a, "numeric")
> [1] FALSE
inherits needs updating ....
> data.class is consistent with R-1.6.2, ok. The class of "a" is
integer,
> also ok. At first: why does "inherits" state that "a"
is not of class
> integer nor numeric?
> And at second: one possible way of writing portable code (between 1.6.2
> and 1.7.0) for generics is using:
> 
> foo <- function(y, ...) {
>   if(is.null(class(y)))
>     class(y) <- data.class(y)
>   UseMethod("foo", y, ...)
> }
> 
> foo.default <- function(y, ...) {
>   stop(paste("Do not know how to handle objects of class",
class(y)))
> }
> 
> (the thread "[Rd] Methods package is now attached by default"
around Jan
> 20th discussed this)
> 
> If I have
> 
> foo.numeric <- function(y, ...)
>   ...
> 
> this works with R-1.6.2 but since foo now dispatches on
"class(y)" this
> fails for integers with r-devel. 
Try
foo <- function(y, ...) {
    if(is.null(oldClass(y))) oldClass(y) <- data.class(y)
    UseMethod("foo", y, ...)
}
or for 1.6.2 compatibility
foo <- function(y, ...) {
    if(is.null(attr(y, "class"))) attr(y, "class") <-
data.class(y)
    UseMethod("foo", y, ...)
}  
(not actually tested).
> Does this mean that I have to implement
> foo.integer methods?
No, but it is the cleanest route.
-- 
Brian D. Ripley,                  ripley@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