有人可以解释为什么在定义新类时重载已注册的旧式S3类上的运算符不能正常工作,并且重载运算符确实有效.
如以下示例所示.
这不起作用.
require(ff)
setOldClass(Classes=c("ff_vector"))
setMethod(
f="*",
signature = signature(e1 = c("ff_vector"), e2 = c("ff_vector")),
definition = function (e1, e2){
print("S3 setOldClass")
e1[] * e2[]
}
)
ff(1:10) * ff(1:10)
Error in ff(1:10) * ff(1:10) : non-numeric argument to binary operator
Run Code Online (Sandbox Code Playgroud)
但这很有效.
setClass("myff_vector", representation(x="ff_vector"))
setMethod(
f="*",
signature = signature(e1 = c("myff_vector"), e2 = c("myff_vector")),
definition = function (e1, e2){
print("S4 setOldClass")
e1@x[] * e2@x[]
}
)
new("myff_vector", x = ff(1:10)) * new("myff_vector", x = ff(1:10))
[1] "S4 setOldClass"
[1] 1 4 9 16 25 36 49 64 81 100
Run Code Online (Sandbox Code Playgroud)
尝试部分答案:\n在帮助(\'方法\')中,在通用函数中部分中,指出:
\n\n\n\n\n可以为大多数原语定义方法,并且将创建相应的元数据对象来存储它们。对原语的调用仍直接转至 C 代码,有时会检查适用的方法。\xe2\x80\x9csometimes\xe2\x80\x9d 的定义是,必须已检测到会话中加载的某些包中的函数的方法,并且\n isS4(x) 为 TRUE(或者对于第二个参数,在二元运算符的情况下)。
\n
回到你的问题,*
是一个原始问题,并且:
library(ff)\nsetOldClass("ff_vector")\nisS4(ff(1:10))\n[1] FALSE\n
Run Code Online (Sandbox Code Playgroud)\n\n因此,据我了解,即使使用 setOldClass(),也不可能在 S3 类上定义原始函数的方法。
\n