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, 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