2015-05-06 3 views
6

wir die folgende Dummy-Klasse Angenommen habentut jeder S4 generisch sein muss

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

dachte ich, sind Generika verwendet, um verschiedene Funktionen zu überlasten. Angenommen, wir möchten einen Accessor implementieren:

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

Ist dies gültig? Oder muss ich definieren eine generische zuerst:

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

Wenn es nur eine bestimmte „Instanz“ dieser Funktionstyp, gibt es keinen Grund, eine generische, richtig zu definieren?

Antwort

1

Um eine S4-Methode zu definieren, muss ein S4-Generic vorhanden sein (entweder von base, aus einem anderen Paket importiert oder selbst definiert). Mein Verständnis dieses Designs besteht darin, die Flexibilität zu bieten, zusätzliche Methoden in der Zukunft hinzuzufügen, selbst wenn Sie sich nicht einmal einen anderen ATM vorstellen können.

Das gesagt, wenn Sie nur versuchen, genauer zu sein, können Sie einfach die Standardfunktion direkt auf die generische Funktion bereitstellen.

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 

So, jetzt haben Sie Ihre Generika einschließlich der einzigen Funktionalität, die Sie wirklich wollten. Sie haben auch die Möglichkeit, das generische in der Zukunft hinzuzufügen, abhängig davon, wie sich Ihre Anwendung entwickelt.

+0

vielen dank! das verdeutlicht viel. – math

Verwandte Themen