From maechler@stat.math.ethz.ch  Wed Apr 14 10:23:20 1999
From: maechler@stat.math.ethz.ch (maechler@stat.math.ethz.ch)
Date: Wed, 14 Apr 1999 11:23:20 +0200
Subject: R's UseMethod() does not dispatch on changed class() (PR#167)
Message-ID: <199904140923.LAA25445@biostat.ku.dk>

       (opening new bug report thread, on suggestion of BDR ..)

I said on vaguely related topic:

 MM> There's  another long-standing  
 MM> UseMethod / NextMethod / Dispatch problem that I've never traced/solved..
 MM>  
 MM> Look at the  $RHOME/tests/mode-methods.R   file !

Peter Dalgaard already remarked :

 PD> ..i.e. this:

 PD> abc <- function(x, ...) {
 PD>     if (is.null(class(x))) class(x) <- data.class(x)
 PD>     UseMethod("abc")
 PD> }
 PD> 
 PD> will dispatch on the data class in S but not in R.
 PD> 
 PD> This puzzles me, because normally you can't mess with the arguments of
 PD> a generic function, in *either* language:
 PD> 
 PD> > cde<-function(x,...){x<-x*2;UseMethod("print")}
 PD> > cde(2)
 PD> [1] 2
 PD> 
 PD> So, either it's because class<- is non-duplicating in S, or S is doing
 PD> something *really* strange here. 
 PD> 
 PD> Hmm, then again: class<- *is* non-duplicating in R:
 PD> 
 PD> > x<-1
 PD> > y<-.Alias(x)
 PD> > class(x)<-'foo'
 PD> > y
 PD> [1] 1
 PD> attr(,"class")
 PD> [1] "foo"
 PD> 
 PD> I think this is related to evaluation of promises:
 PD> 
 PD> > f<-function(x)substitute(x)
 PD> > f(sin(1))
 PD> sin(1)
 PD> > f<-function(x){x;substitute(x)}
 PD> > f(sin(1))
 PD> sin(1)
 PD> > f<-function(x){class(x)<-'foo';substitute(x)}
 PD> > f(sin(1))
 PD> [1] 0.841471
 PD> attr(,"class")
 PD> [1] "foo"
 PD> 
 PD> Notice that just forcing evaluation of x does not destroy the link
 PD> between x and the argument expression, but changing its class does.
 PD> This is probably what shouldn't happen.
 PD> 
 PD> You can get the dispatching done by using
 PD> 
 PD> abc <- function(x, ...) {
 PD>     if (is.null(class(x))) {
 PD> 	class(x) <- data.class(x)
 PD> 	abc(x, ...)
 PD>     } else
 PD>         UseMethod("abc")
 PD> }
 PD> 
 PD> which (seemingly) works in both languages, at least as long as you
 PD> don't have to mess with sys.parent()

So we don't know if this is a bug in R.
However, R is behaving inexpectedly to ``Joe Average-User''
and at least we should know if (and why)
we want to be different than S here.

-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._


R's UseMethod() does not dispatch on changed class() (PR#167)
maechler@stat.math.ethz.ch