2012-12-12 14 views
6

R Wersja:Zastosowanie S3 wirtualne klasy jako szczeliny klasy S4, dostaje błąd: got klasa „S4”, powinno być lub rozszerzyć klasę „nls.lm”

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

Chcę uczynić klasy S4 że użycie obiektu wyjściowego funkcji nls.lm (pakiet: minpack.lm) jako gniazda:

setOldClass("nls.lm") 

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

teraz, jeśli chcę wywołać tę klasę w „funkcji konstruktora” mogę zrobić coś takiego to (poprawne?):

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) 

A obiekt "pippo" wydaje się poprawnie zainicjowany.

Jeśli używam tego kodu zamiast mam błąd:

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" 

wydaje się, że jeśli chcę Init w nowy niektóre gniazda, to stworzyć problem z gniazda S3 Class?

Jakąkolwiek wskazówkę, jak uniknąć tego problemu?

Dzięki

Odpowiedz

3

Faktycznie, konstruktor bez argumentów zwraca nieprawidłowy obiekt, zbyt, to po prostu nie testowane

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

rozwiązaniem jest zapewnienie odpowiedniego prototypu, może

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

dzięki za szybką odpowiedź. Właśnie zaimplementowałem w moim "prawdziwym" kodzie. Obiekt jest teraz ważny! – tucano

Powiązane problemy