与S4类相比,使用setOldClass时重载运算符不能正常工作

10 r s4

有人可以解释为什么在定义新类时重载已注册的旧式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)

Kar*_*ner 0

尝试部分答案:\n在帮助(\'方法\')中,在通用函数中部分中,指出:

\n\n
\n

可以为大多数原语定义方法,并且将创建相应的元数据对象来存储它们。对原语的调用仍直接转至 C 代码,有时会检查适用的方法。\xe2\x80\x9csometimes\xe2\x80\x9d 的定义是,必须已检测到会话中加载的某些包中的函数的方法,并且\n isS4(x) 为 TRUE(或者对于第二个参数,在二元运算符的情况下)。

\n
\n\n

回到你的问题,*是一个原始问题,并且:

\n\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