[R] Operator overloading

Peter Dalgaard P.Dalgaard at biostat.ku.dk
Thu Jul 10 15:05:58 CEST 2008


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 "+"


-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark      Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)              FAX: (+45) 35327907



More information about the R-help mailing list