From mtmorgan at fhcrc.org  Thu Jun 21 04:59:57 2012
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Wed, 20 Jun 2012 19:59:57 -0700
Subject: [Rd] "Incompatible methods" for overloaded operator
In-Reply-To: <CABdHhvF-WRwa9QaXG7Tb6JoiZJYH70OzUSdvAwUSY_6ZTnWvHQ@mail.gmail.com>
References: <CAFOpNVFyqaTZHG15N2w13OqBJSwdVfdpbWGfsJim3XhNCmdYfw@mail.gmail.com>
	<CABdHhvF-WRwa9QaXG7Tb6JoiZJYH70OzUSdvAwUSY_6ZTnWvHQ@mail.gmail.com>
Message-ID: <4FE28E2D.7050205@fhcrc.org>

On 06/20/2012 07:25 PM, Hadley Wickham wrote:
> Hi all,
>
> Any ideas about this?  As far as I can tell it should work - and I
> don't understand why it's ok when run outside of a package.

from ?groupGeneric under 'Ops' (of which "+" is one)

           used.  If different methods are found, there is a warning
           about 'incompatible methods': in that case or if no method is
           found for either argument the internal method is used.

which doesn't really explain why it works at the command line but not in 
a package. S4 methods can be defined on both arguments, so

   setClass("A", contains="numeric")
   setClass("B", contains="numeric")

   setMethod("+", c("A", "A"), function(e1, e2) message("A + A"))
   setMethod("+", c("A", "B"), function(e1, e2) message("A + B"))
   setMethod("+", c("B", "A"), function(e1, e2) message("B + A"))
   setMethod("+", c("B", "B"), function(e1, e2) message("B + B"))

with

   exportClasses("A", "B")
   exportMethods("+")

and then

 > new("A") + new("B")
A + B
NULL


Martin

>
> Hadley
>
> On Wed, Jun 13, 2012 at 7:41 PM, Winston Chang<winstonchang1 at gmail.com>  wrote:
>> I'm trying to overload an operator, and I'm running into a strange problem.
>> It happens when I install and load the package, but not when I simply
>> source() the code.
>>
>> I'm defining + for two classes. The R code looks like this:
>> #' @export
>> #' @method "+" a
>> `+.a`<- function (x1, x2) {
>>     message("Running custom + function")
>> }
>>
>> #' @export
>> #' @method "+" b
>> `+.b`<- `+.a`
>>
>> In some cases I do a+b, and in other cases, I do b+b. I'm told that the +.a
>> and +.b functions must be identical to avoid the error about "Incompatible
>> methods". (In the actual code, the overloaded + function checks the classes
>> of x1 and x2, and then sends them off to other functions.)
>>
>> This is the NAMESPACE file:
>> S3method("+",a)
>> S3method("+",b)
>>
>> I've put the code up at https://github.com/wch/badadd.
>>
>>
>>
>> If I just cut and paste the function definitions to my R session, it works
>> fine:
>> x + y
>> # Running + function
>> # NULL
>>
>>
>> However, if I install and load the package, it gives a warning about
>> incompatible methods, and then seems to fall back to the arithmetic +
>> operator:
>> library(badadd)
>> x + y
>> # [1] 3
>> # attr(,"class")
>> # [1] "a"
>> # Warning message:
>> # Incompatible methods ("+.a", "+.b") for "+"
>>
>>
>> Is this expected behavior? And if so, is there a workaround?
>> -Winston
>>
>>         [[alternative HTML version deleted]]
>>
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>
>
>


-- 
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



[Rd] "Incompatible methods" for overloaded operator
Martin Morgan