From Kurt.Hornik@wu-wien.ac.at  Mon Jan 20 00:05:03 2003
From: Kurt.Hornik@wu-wien.ac.at (Kurt Hornik)
Date: Mon Jan 20 00:05:03 2003
Subject: [Rd] Methods package is now attached by default
In-Reply-To: <Pine.WNT.4.44.0301181044480.1088-100000@petrel>
References: <3E287D10.8692826A@research.bell-labs.com>
 <Pine.WNT.4.44.0301181044480.1088-100000@petrel>
Message-ID: <15915.7358.236309.327617@mithrandir.hornik.net>

>>>>> Prof Brian D Ripley writes:

> On Fri, 17 Jan 2003, John Chambers wrote:
>> There are two main known differences from having methods attached:
>> 
>> - the definition of class() changes, in particular no object ever has a
>> NULL class.  If you have code that depends on test such as
>> `if(is.null(class(x)))...', there may be problems.
>> 
>> Usually code with those sort of tests is doing a workaround of the fact
>> that not all objects had a class before.  The best solution is usually
>> to ask what the code really wants to do.  If you do have to retain
>> exactly the old behavior, one solution is to copy the version of class
>> and class<- from the base package and use those (as baseClass and
>> baseClass<-, e.g.) instead of class and class<-).

> Here is one example, which makes the MASS scripts fail.

>> library(MASS)
>> corresp
> function (x, ...)
> {
>     if (is.null(class(x)))
>         class(x) <- data.class(x)
>     UseMethod("corresp", x, ...)
> }

> That used to work with matrices, and dispatch to corresp.matrix.  Now
> a matrix has reported class "matrix" but dispatch occurs to
> corresp.default.  The temporary fix is to remove the is.null
> condition.

> That's quite a common construction, and I think I should expect
> UseMethod to dispatch on the class class() reports.  So it looks to me
> as if UseMethod needs to be altered to do so.

> ...

The daily check process on all CRAN packages shows that the packages

	StatDataML geoR ipred xtable

now fail running their examples with methods loaded by default.  The
three latter can be traced immediately to variations on the above; the
first fails in

    if (is.factor(x)) {
      attr(xtmp, "levels") <- NULL
      class(xtmp) <- class(xtmp)[!class(xtmp) %in% c("ordered","factor")]
    }

with the error message

Error in "class<-"(*tmp*,
                   value = class(xtmp)[!class(xtmp) %in% c("ordered",  : 
        Invalid replacement object to be a class string

I think I can tell David how to fix this, but wasn't quite sure about
the wording in the error message ...

I assume I should wait before contacting the authors of the other 3
packages for changing their code---or do we already have an official
recommendation?

-k



[Rd] Methods package is now attached by default
Kurt Hornik