2014-09-30 15 views
5

Güçlü doğrusal modellere sahip yuvalara sahip bir S4 sınıfı oluşturmak istiyorum.Güçlü doğrusal modeller için S4 sınıfında nasıl yuva oluşturabilirim?

Sağlam doğrusal modeller, MASS paketinden bir doğrusal model türüdür. Doğrusal bir modelin sahip olduğu tüm bilgileri ve biraz daha fazlasını taşırlar. Bir rlm içeren bir nesne başlatılırken, beklenen nesneyi üreten başarısız

.MyClass <- setClass("MyClass", list(a="lm", id="numeric")) 

bile .MyClass(a=mylm, id=1) olsa: İşte

library(MASS) 
x <- 1:5 
y <- 1:5 
mylm <- lm(x~y) 
myrlm <- rlm(x~y) 

benim sınıftır ben sanırdım
> .MyClass(a=myrlm, id=1) 
Error in validObject(.Object) : 
    invalid class “MyClass” object: 1: invalid object for slot "a" in class "MyClass": got class "rlm", should be or extend class "lm" 
invalid class “MyClass” object: 2: invalid object for slot "a" in class "MyClass": got class "lm", should be or extend class "lm" 

o is(myrlm, "lm") getiri beri TRUE bir sorun olmaz ve nesne yuvaya sığabilir. Ayrıca, bana iki kez geçersiz bir nesne yarattığımı söylediği için, neden lm'un kendisinin olmadığını söyleyen ikinci neden? lm sanal bir sınıf olduğu için mi?

Temsili (lm ve rlm her ikisi de listeler olduğu için) a="list" ayarlamayı denedim, ancak benzer bir hata üretir. Yuva farklı bir sınıf türüne mi ihtiyaç duyar? Ayrıca a="rlm" ayarlamayı denedim, ancak rlm tanımlı sınıf değil.

+1

harika bir soru. S3/S4 uyuşmazlıklarının içine düştüğünden şüpheleniyorum, ama umarım (sizin iyiliğiniz için) siz değilsinizdir. S3 "rlm" sınıfını kapsayan/saran bir S4 sınıfı oluşturmayı deneyebilirsiniz (???)? –

cevap

1

Sorun, rlm nesnesinin iki S3 sınıfına sahip olması gerçeğidir. Bir çalışma olarak, bir kurucu tanımlamak ve nesneleri oluşturmadan önce yuvaların sınıfını değiştirmek için öneririm. Bu satırlarda bir şey:

library(MASS) 
    x <- 1:5 
    y <- 1:5 
    mylm <- lm(x~y) 
    myrlm <- rlm(x~y) 
    .MyClass <- setClass("MyClass", list(a="lm", id="numeric")) 
    MyClass<-function(a,id) { 
    if (!is(a,"lm")) stop("error") 
    class(a)<-"lm" 
    new("MyClass",a=a,id=id) 
    } 
    MyClass(myrlm,1) 
+0

Güzel! Sanırım lm' sanal bir sınıf olduğundan, gerçekten herhangi bir nesne doğrulaması yok. Herhangi bir liste benzeri nesne ve sanal sınıf için çalışır gibi görünüyor. –

İlgili konular