[Rd] Methods package is now attached by default
Kurt Hornik
Kurt.Hornik@wu-wien.ac.at
Mon Jan 20 00:05:03 2003
>>>>> 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