[R] Operator overloading

Spencer Graves spencer.graves at pdf.com
Thu Jul 10 20:51:49 CEST 2008


      The 'polynom' package provides one example of how to do this.  
However, getAnywhere("+.polynomial") just told me "no object named 
‘+.polynomial’ was found";  I don't know why.  The documentation says it 
uses S3 classes.  The 'Matrix' package should provide other examples, 
using S4 classes.  You can get the package source for both as "*.tar.gz" 
files from CRAN, unzip the file and see what they did. 

      Hope this helps. 
      Spencer     

Peter Dalgaard wrote:
> hadley wickham wrote:
>   
>> On Thu, Jul 10, 2008 at 5:09 AM, Peter Dalgaard
>> <P.Dalgaard at biostat.ku.dk> wrote:
>>   
>>     
>>> Tine wrote:
>>>     
>>>       
>>>> Hi!
>>>>
>>>> I was just wondering is there anyway to overload operator for custom
>>>> class.
>>>> For example:
>>>> I have two matrices A and B with same dimensions. I want to overload
>>>> operator '+' with my own function.
>>>> Or even better can I create my own (new) operator.
>>>> Example:
>>>> A+-B where '+-' would be some function.
>>>>
>>>>       
>>>>         
>>> You can define an S3 method
>>>
>>> "+.myclass" <- function(a,b) {...}
>>>
>>> Notice that dispatch is only on the 1st argument. This is a generic
>>> weakness of  S3 methods. The Matrix package implements similar things
>>> with S4 methods, but it does tend to get rather complicated.
>>>     
>>>       
>> That's not completely true is it?
>>
>>   
>>     
>>> 2 * unit(2, "cm")
>>>     
>>>       
>> [1] 2*2cm
>>   
>>     
>>> unit(2, "cm") * 2
>>>     
>>>       
>> [1] 2*2cm
>>
>> (But I'm not sure why that works)
>>   
>>     
> Group generics. Yes, I forgot about those. They dispatch on _any_
> argument being of a given class. The problem is that it is a single
> dispatch, which is why R gets itself in a twist when you try to add
> Dates and difftimes:
>
>   
>> as.Date("2008-7-10")+as.difftime(2,units="days")
>>     
> [1] "2008-07-12"
> Warning message:
> Incompatible methods ("+.Date", "Ops.difftime") for "+"
>   
>> as.difftime(2,units="days")+as.Date("2008-7-10")
>>     
> Time difference of 14072 days
> Warning message:
> Incompatible methods ("Ops.difftime", "+.Date") for "+"
>
>
>



More information about the R-help mailing list