Qualcuno può spiegare perché il sovraccarico di un operatore su una classe S3 vecchio stile che è registrato non funziona come previsto, mentre quando si definisce una nuova classe e di sovraccaricare gli operatori fa lavoro.sovraccaricare gli operatori quando si utilizza setOldClass non funziona come voluto rispetto a una classe S4
Come mostrato negli esempi seguenti.
Questo non funziona.
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
Ma questo funziona.
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")
[email protected][] * [email protected][]
}
)
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