2013-04-10 20 views
10

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 

risposta

0

tentativo di una risposta parziale: In aiuto ('Metodi'), nei funzioni generiche sezione, si afferma:

metodi possono essere definiti per la maggior parte primitive, e corrispondenti metadati oggetti saranno creati per la memorizzazione. Le chiamate al primitivo ancora andare direttamente al codice C, che a volte controllare applicabili metodi. La definizione di "a volte" è che i metodi devono essere stati rilevati per la funzione nella sessione e isS4 (x) è TRUE per il primo argomento (o per il secondo argomento, in il caso di operatori binari).

Torna al tuo problema, * è un primitivo, e:

library(ff) 
setOldClass("ff_vector") 
isS4(ff(1:10)) 
[1] FALSE 

Quindi, da quello che ho capito, non è possibile definire un metodo per funzioni primitive su classi S3, anche se si utilizza setOldClass().

0

Non è proprio chiaro dalla questione se questo conta come una risposta, ma per la cronaca, l'operatore potrebbe essere sovraccaricato in puro e semplice S3-style, senza alcuna setOldClass o S4:

`*.ff_vector` <- function(x, y) { 
    print("hi") 
    x[] * y[] 
} 

> ff(1:10) * ff(1:10) 
[1] "hi" 
[1] 1 4 9 16 25 36 49 64 81 100 
Problemi correlati