2012-12-12 13 views
6

R Version sein oder erweitern:Verwenden S3 virtuelle Klasse als Slot einer S4-Klasse, bekamen Fehler: got Klasse "S4", sollte Klasse "nls.lm"

R version 2.15.2 (2012-10-26) 
    Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit) 

Ich mag eine S4-Klasse machen dass das Ausgangsobjekt der Funktion von nls.lm verwenden (Paket: minpack.lm) als Schlitz:

setOldClass("nls.lm") 

setClass (
    Class="TestClass", 
    representation=representation(
     lmOutput = "nls.lm", 
     anumeric = "numeric" 
    ) 
) 

Nun, wenn ich diese Klasse in einer „Konstruktorfunktion“ nennen möchte ich etwas tun kann, wie diese (korrekt?):

myConstructor <- function() 
{ 
    return(new("TestClass")) 
} 

pippo <- myConstructor() 

pippo 
An object of class "TestClass" 
Slot "lmOutput": 
<S4 Type Object> 
attr(,".S3Class") 
[1] "nls.lm" 

Slot "anumeric": 
numeric(0) 

Und das Objekt „Pippo“ scheint korrekt initialisiert.

Wenn ich diesen Code verwenden stattdessen bekam ich einen Fehler:

myConstructor2 <- function() 
{ 
    pippo <- new("TestClass", anumeric=1000) 
    return(pippo) 
} 

pippo <- myConstructor2() 
Error in validObject(.Object) : 
invalid class “TestClass” object: invalid object for slot "lmOutput" in class "TestClass": got class "S4", should be or extend class "nls.lm" 

Es scheint, dass, wenn ich in neuen einige Slots INIT wollen, dies schaffen Problem mit einem S3-Klasse-Slot?

Gibt es Hinweise, wie Sie dieses Problem vermeiden können?

Dank

Antwort

3

Eigentlich ist der Konstruktor ohne Argumente ein ungültiges Objekt zurückgibt, auch, es ist nur nicht

getestet
> validObject(new("TestClass")) 
Error in validObject(new("TestClass")) : 
    invalid class "TestClass" object: invalid object for slot "lmOutput" 
    in class "TestClass": got class "S4", should be or extend class "nls.lm" 

Die Lösung ist eine geeignete Prototyp zur Verfügung zu stellen, vielleicht

setClass (
    Class="TestClass", 
    representation=representation(
     lmOutput = "nls.lm", 
     anumeric = "numeric" 
    ), 
    prototype=prototype(
     lmOutput=structure(list(), class="nls.lm") 
    ) 
) 
+0

Danke für die schnelle Antwort. Nur in meinem "echten" Code implementiert. Objekt ist jetzt gültig! – tucano