在使用 S3 类时,我想重载 R 中的“*”(乘法运算符)。
我看到 * 在系统中已经是通用的,但我也想要它“generic2”,即在第二个参数上调度。
用例如下:假设我的类名为“Struct”。我希望能够允许所有这三种情况
Struct * Struct
Struct * Number
Number * Struct
但是我发现,如果我允许在第二个参数上进行调度,则(已经存在的)第一个参数上的调度将被覆盖!
有没有办法可以在 S3 中做到这一点?
# "generic1" already exists for '*'
'*' <- function(x,y){
UseMethod('*2',y)
}
'*.Struct'<-function(x,y){
# must both be structs, so dispatch 'normally' if not
"times(1)"
}
`*2.Struct`<-function(x,y){
# must both be structs, so dispatch 'normally' if not
"times(2)"
}
给我...
> struct1 * struct2
[1] "times(2)"
> 2 * struct2
[1] "times(2)"
> struct1 * 2
Error in UseMethod("*2", y) :
no applicable method for '*2' applied to an object of class "c('double', 'numeric')"
>
如果我使用这个,而不是
'*' <- function(x,y){ UseMethod('*',x)}
然后第一个参数的调度起作用,相反的情况发生了:
> struct1 * 2
[1] "times(1)"
> struct1 * struct2
[1] "times(1)"
> 2* struct1
Error in UseMethod("*", x) :
no applicable method for '*' applied to an object of class "c('double', 'numeric')"
>
所以看起来他们肯定会互相覆盖。
关于两者如何和平和富有成效地共存的任何想法?