2016-11-14 4 views
0

stelle ich einen kurzen Code eine S4-Klasse myclass gewährleisten und dafür zu schaffen, dass Objekte erstellt werden, wenn sie einen Zustand von einem param Parameter angegeben überprüfenS4 Klassenkonstruktors und Validierung

setClass("myclass", slot = c(x = "numeric")) 

#constructor 
ValidmyClass<- function(object, param = 1) 
{ 
if([email protected] == param) return(TRUE) 
else return("problem") 

} 
setValidity("myclass", ValidmyClass) 

setMethod("initialize","myclass", function(.Object,...){ 
.Object <- callNextMethod() 
validObject(.Object,...) 
.Object 
}) 

für die ich die folgende Fehlermeldung erhalten Error in substituteFunctionArgs(validity, "object", functionName = sprintf("validity method for class '%s'", : trying to change the argument list of for validity method for class 'myclass' with 2 arguments to have arguments (object)

Ich verstehe das Problem mit den Argumenten, aber ich kann keinen Weg finden, um dies zu lösen. Das Dokument über setValidity erwähnt, dass die Argumentmethode "Validitätsmethode sein sollte; das heißt entweder NULL oder eine Funktion eines Arguments (Objekts)". Daher von meinem Verständnis ausgeschlossen mehr als ein Argument.

Dennoch ist die Idee hinter diesem Beispiel, dass ich die Konstruktion eines Objekts basierend auf dem Wert eines externen gegebenen Parameters testen kann. Wenn mehr Bedingungen hinzugefügt werden sollten, würde ich mir genügend Flexibilität wünschen, so dass nur die Funktion ValidmyClass aktualisiert werden muss, ohne dass notwendigerweise weitere Slots hinzugefügt werden müssen.

Antwort

1

Die Gültigkeitsfunktion muss ein Argument mit dem Namen object haben. Wenn ich eine Argumentfunktion erstellen muss, aber wirklich mehr Argumente oder Daten habe, die ich weitergeben kann, wende ich mich oft wieder der Verwendung von Schließungen zu. Hier ändert sich die Implementierung Ihrer ValidmyClass, indem sie nun die eigentliche Gültigkeitsfunktion zurückgibt. Das Argument der umschließenden Funktion ist dann die Menge der zusätzlichen Argumente, die Sie interessiert sind

setClass("myclass", slot = c(x = "numeric")) 

#constructor 
ValidmyClass <- function(param) { 
    force(param) 
    function(object) { 
    if ([email protected] == param) TRUE 
    else "problem" 
    } 
} 

setValidity("myclass", ValidmyClass(1)) 

Auch die Gültigkeit Funktion automatisch auf init aufgerufen wird. jedoch nicht, wenn der Steckplatz x geändert wird, nachdem das Objekt erstellt wurde.

setMethod("initialize", "myclass", function(.Object,...) { 
    .Object <- callNextMethod() 
    .Object 
}) 

new("myclass", x = 2) 
new("myclass", x = 1) 

Weitere Informationen zu Verschlüssen finden Sie unter adv-R. Obwohl ich denke, dass dies Ihre Frage beantwortet, sehe ich nicht, wie diese Implementierung tatsächlich hilfreich ist. Wenn Sie Ihre Klasse definieren, fixieren Sie grundsätzlich auch die zusätzlichen Parameter, die die Gültigkeitsfunktion kennt. Wenn Sie mehrere Klassen haben, für die Sie die Gültigkeitsfunktion abstrahieren können, würde ich die Schließung verwenden. Wenn Sie eine Klasse mit Parametern zur Laufzeit haben, würde ich überlegen, der Klasse einen Slot hinzuzufügen. Wenn Sie die Klassendefinition nicht ändern möchten, können Sie einen Slot der Klasse Liste hinzufügen, in dem Sie eine beliebige Anzahl von Werten übergeben können, um zu testen.