[Rd] S4 objects for S3 methods

John Chambers jmc at r-project.org
Fri Mar 6 23:12:00 CET 2009


Some modifications have been committed for the r-devel version today 
that modify (essentially, correct a bug in) the communication of objects 
to an S3 method from an S4 class that extends the S3 class.

This is one of a sequence of changes designed to make S4 classes work 
more generally and consistently with S3 methods and classes.

In 2.8.0, support was provided for S4 classes that extend S3 classes, 
partly by making S3 method dispatch recognize the inheritance.

The catch was that the S3 method would get the S4 object.  Two problems 
with that:

1. The S3 method would fail if it tried to use the S3 class information 
directly, since the class attribute was the S4 class.

2. More seriously, if the method used the object, modified it and 
returned the result, it had a good chance of returning an invalid object 
seeming to come from the S4 class.

The modification to deal with this now delivers to the S3 method the 
inherited S3 object.  (This turned out to be somewhat harder than the 
original change, since it impacts several pieces of internal code.)  A 
revision of the function asS4() deals with similar concerns--see the 
documentation.

The change does not affect default methods.  It would be tempting to 
convert S4 objects for those, but some S3 generics attempt to deal with 
S4 objects, e.g., str().  A change to the primitives that dispatch 
methods is more plausible, but for the moment all that was added was 
more explicit error messages if a non-vector S4 object is supplied.

For more information see the section on inheriting from non-S4 classes 
in the documentation ?Classes.

It would be helpful if package maintainers would check this and previous 
changes by running their code against the r-devel version of R, before 
that becomes 2.9.0.  Please report any new errors (provided, of course, 
that the same code works with 2.8.1).

John



More information about the R-devel mailing list