2014-09-30 5 views
5

मैं एक एस 4 कक्षा बनाना चाहता हूं जिसमें स्लॉट हैं जो मजबूत रैखिक मॉडल रख सकते हैं।मजबूत रैखिक मॉडल के लिए मैं एस 4 कक्षा में स्लॉट कैसे बना सकता हूं?

मजबूत रैखिक मॉडल MASS पैकेज से रैखिक मॉडल का एक प्रकार हैं। वे सभी जानकारी एक रैखिक मॉडल है और थोड़ा और लेते हैं।

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(a=mylm, id=1) हालांकि, उम्मीद वस्तु का उत्पादन एक rlm के साथ एक वस्तु को प्रारंभ करने में विफल रहता है:

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

मैं सोचा होगा कि is(myrlm, "lm") रिटर्न के बाद से TRUE कोई मुद्दा नहीं होगा और ऑब्जेक्ट स्लॉट में फिट हो सकता है। इसके अलावा, चूंकि यह मुझे बता रहा है कि मैंने एक अवैध वस्तु दो बार बनाई है, दूसरा यह कह रहा है कि lm स्वयं नहीं है? क्या ऐसा इसलिए है क्योंकि lm एक वर्चुअल क्लास है?

मैंने प्रतिनिधित्व में a="list" सेट करने का प्रयास किया है (lm और rlm दोनों सूचियां हैं), लेकिन यह एक समान त्रुटि उत्पन्न करता है। क्या स्लॉट को एक अलग वर्ग प्रकार की आवश्यकता है? मैंने a="rlm" सेटिंग करने का भी प्रयास किया है, लेकिन rlm परिभाषित वर्ग नहीं है।

+1

महान प्रश्न। मुझे संदेह है कि आप एस 3/एस 4 असंगतताओं के नरक में उतर रहे हैं, लेकिन मुझे आशा है कि (आपके लिए) कि आप नहीं हैं। आप (एस) एस 4 कक्षा बनाने की कोशिश कर सकते हैं जो एस 3 "आरएलएम" कक्षा को शामिल/लपेटता है ...? –

उत्तर

1

समस्या यह तथ्य प्रतीत होता है कि rlm वस्तुओं में दो S3 कक्षाएं हैं। मैं ऑब्जेक्ट बनाने से पहले एक कन्स्ट्रक्टर को परिभाषित करने और स्लॉट के वर्ग को बदलने के लिए, कार्य-आसपास के रूप में सुझाव देता हूं। इन पंक्तियों के साथ कुछ:

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

अच्छा! मुझे लगता है कि 'एलएम' वर्चुअल क्लास है, वास्तव में कोई ऑब्जेक्ट सत्यापन नहीं है। ऐसा लगता है कि यह किसी भी सूची-जैसी वस्तु और वर्चुअल क्लास के लिए काम करता है। –

संबंधित मुद्दे