2012-12-12 13 views
6

R Versione:Usa S3 classe virtuale come fessura di una classe S4, errore ottenuto: got classe "S4", dovrebbe essere o estendere classe "nls.lm"

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

Voglio fare una classe S4 che utilizzano l'oggetto di output della funzione di nls.lm (pacchetto: minpack.lm) come uno slot:

setOldClass("nls.lm") 

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

Ora, se voglio chiamare questa classe in una "funzione di costruzione" posso fare qualcosa di simile questo (corretto?):

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) 

E l'oggetto "pippo" sembra inizializzato correttamente.

Se io uso questo codice invece ho ottenuto un errore:

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" 

sembra che se voglio INIT in new alcuni slot, questo crea problemi con uno slot S3 classe?

Qualsiasi indizio su come evitare questo problema?

Grazie

risposta

3

In realtà, il costruttore senza argomenti restituisce un oggetto non valido, troppo, è solo non testato

> 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" 

La soluzione è quello di fornire un prototipo del caso, forse

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

grazie per la risposta rapida. Appena implementato nel mio codice "reale". L'oggetto è valido ora! – tucano

Problemi correlati