From jmc@research.bell-labs.com  Sat Jan 18 15:12:02 2003
From: jmc@research.bell-labs.com (John Chambers)
Date: Sat Jan 18 15:12:02 2003
Subject: [Rd] Methods package is now attached by default
References: <Pine.WNT.4.44.0301181044480.1088-100000@petrel>
Message-ID: <3E29609B.D76E32A5@research.bell-labs.com>

Prof Brian D Ripley wrote:
> 
> 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.

I agree.  This seems an example of the workaround to dispatch on
"classes" that didn't have a class attribute in the old style.

The only situation I can see immediately that would be broken by a
change to UseMethod on these lines would be a case that, e.g., a
foo.matrix existed but the programmer wanted to dispatch foo.default on
matrix objects without an explicit class attribute.  Seems rather
bizarre.

Can anyone think of other situations that would break?

John

> 
> Brian
> 
> --
> 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
> 
> ______________________________________________
> R-devel@stat.math.ethz.ch mailing list
> http://www.stat.math.ethz.ch/mailman/listinfo/r-devel

-- 
John M. Chambers                  jmc@bell-labs.com
Bell Labs, Lucent Technologies    office: (908)582-2681
700 Mountain Avenue, Room 2C-282  fax:    (908)582-3340
Murray Hill, NJ  07974            web: http://www.cs.bell-labs.com/~jmc



[Rd] Methods package is now attached by default
John Chambers