2015-05-06 11 views
6

Supponiamo di avere la seguente classe fittiziafa ogni S4 deve essere generico

Foo <- setClass(Class = "Foo",slots = c(foo = "numeric"), 
    prototype = list(foo = numeric()) 

ho pensato, i generici sono utilizzati per sovraccaricare diverse funzioni. Quindi supponiamo di voler implementare una accessor:

setMethod(f = "getFoo", signature = "Foo", 
    definition = function(Foo) 
    { 
     return([email protected]) 
    } 
) 

È valido? O devo definire una prima generica:

setGeneric(name="getFoo", 
    def=function(Foo) 
    { 
     standardGeneric("getFoo") 
    } 
) 

Se c'è solo un particolare "istanza" di questo tipo di funzione, non c'è motivo di definire un generico, giusto?

risposta

1

Per definire un metodo S4, deve esistere un generico S4 esistente (o da base, importato da un altro pacchetto o definito dall'utente). La mia conoscenza di questo progetto è quella di fornire la flessibilità per aggiungere ulteriori metodi in futuro, anche se non si riesce nemmeno a concepire un altro sportello automatico.

Detto questo, se si sta solo cercando di essere più concisi, si potrebbe semplicemente fornire la funzione predefinita direttamente alla funzione generica.

setClass(Class = "Foo",slots = c(foo = "numeric"), 
       prototype = list(foo = numeric())) 

setGeneric(name="getFoo", 
      def=function(Foo) 
      { 
       standardGeneric("getFoo") 
      }, useAsDefault=function(Foo){return([email protected])} 
) 

# test the function 
testFoo <- new("Foo", foo=3) 

getFoo(testFoo) 
[1] 3 

Quindi, ora avete il vostro generico compreso l'unica funzionalità che davvero volevate comunque. Hai anche la possibilità di aggiungere il generico in futuro a seconda di come si sviluppa la tua applicazione.

+0

grazie mille! che chiarisce molto. – math