[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