Re: [Rd] match gets confused by S4 objects

From: Martin Maechler <>
Date: Tue 07 Feb 2006 - 13:07:57 GMT

>>>>> "BDR" == Prof Brian Ripley <> >>>>> on Mon, 6 Feb 2006 19:44:50 +0000 (GMT) writes:

    BDR> An S4 object is just a list with attributes, so a
    BDR> vector type.  match() works with all vector types
    BDR> including lists, as you found out (or could have read).

yes, the internal representation of S4 objects is such -- seen from a non-S4 perspective.

    BDR> If in the future those proposing it do re-implement an
    BDR> S4 object as an new SEXP then this will change, but for
    BDR> now the cost of detecting objects which might have an
    BDR> S4 class defined somewhere is just too high (and would
    BDR> fall on those who do not use S4 classes).

Just for further explanation, put into other words and a slightly changed point of view:

Yes, many R functions get confused by S4 objects, most notably, c() (!)

>> if(has.class <- !is.null(cl <- attr(object, "class"))) { # S3 or S4 class
>> ## FIXME: a kludge
>> S4 <- !is.null(attr(cl, "package")) || cl == "classRepresentation"
>> ## better, but needs 'methods': length(methods::getSlots(cl)) > 0
>> }

   which --- when only testing for S4-presence --- you could collapse to

      if(!is.null(cl <- attr(object, "class")) &&
	 (!is.null(attr(cl, "package")) || 
	  cl == "classRepresentation"))     {



  but note the comment >>>> ## FIXME: a kludge <<<

The solution has been agreed to be changing the internal representation of S4 objects making them a new SEXP (basic R "type"); and as Brian alludes to, the problem is that those in R-core that want to and are able to do this didn't have the time for that till now.

Martin Maechler, ETH Zurich

    BDR> On Mon, 6 Feb 2006, Seth Falcon wrote:

    >> If one accidentally calls match(x, obj), where obj is any S4 instance,
    >> the result is NA.
    >> I was expecting an error because, in general, if a match method is not
    >> defined for a particular S4 class, I don't know what a reasonable
    >> default could be.  Specifically, here's what I see
    >> setClass("FOO", representation(a="numeric"))
    >> foo <- new("FOO", a=10)
    >> match("a", foo)
    >> [1] NA
    >> And my thinking is that this should be an error, along the lines of
    >> match("a", function(x) x)
    >> Unless, of course, a specific method for match, table="FOO" has been
    >> defined.

    BDR> -- 
    BDR> Brian D. Ripley,        
    BDR> Professor of Applied Statistics,
    BDR> University of Oxford,             Tel:  +44 1865 272861 (self)
    BDR> 1 South Parks Road,                     +44 1865 272866 (PA)
    BDR> Oxford OX1 3TG, UK                Fax:  +44 1865 272595

    BDR> ______________________________________________
    BDR> mailing list     BDR> mailing list Received on Wed Feb 08 00:13:04 2006

This archive was generated by hypermail 2.1.8 : Mon 20 Feb 2006 - 03:21:40 GMT