On Sun, 19 Jan 2003, Kurt Hornik wrote: > >>>>> 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. >
same happens e.g. with class "numeric": ipredbagg <- function(y, ...) UseMethod("ipredbagg") does NOT dispatch to ipredbagg.numeric if y IS of class "numeric". With the "old" class(), this one worked: ipredbagg.default <- function(y, ...) { # "numeric" is not an S3 class: check for regression problems and # the method dispatch should work for class(y) == "numeric" if (is.numeric(y)) { class(y) <- "numeric" return(ipredbagg(y, ...)) } else { stop(paste("Do not know how to handle objects of class", class(y))) } } but now I need to call return(ipredbagg.numeric(y, ...)) I think Brian is right with altering UseMethod() in a way taking care of what class() tells us. > > ... > > 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? I can fix the code for ipred. The only problem is making it work for both R-1.6.2 AND R-devel :-) Torsten > > -k > > ______________________________________________ > [EMAIL PROTECTED] mailing list > http://www.stat.math.ethz.ch/mailman/listinfo/r-devel > > ______________________________________________ [EMAIL PROTECTED] mailing list http://www.stat.math.ethz.ch/mailman/listinfo/r-devel