2011-09-19 11 views
10

मैं आरआर में एनयूएलएल के रूप में स्लॉट के डिफ़ॉल्ट मान को कैसे सेट करें?

मैं एक वर्ग एक पेड़ नोड के लिए इसी तरह परिभाषित करने के लिए कोशिश कर रहा हूँ करने के लिए नए हूँ, कि, यह एक छोड़ दिया नोड और सही नोड है, जो माता-पिता नोड के रूप में एक ही कक्षा की होनी चाहिए है । इसलिए मैं वर्ग इस प्रकार निर्धारित करें:

setClass('Node', representation=(left='Node',right='Node', ...)) 

मैं एक प्रोटोटाइप की स्थापना करके शून्य होने के लिए नोड का डिफ़ॉल्ट मान सेट करना चाहते हैं, लेकिन आर निम्नलिखित कहते हैं:

invalid class "Node" object: invalid object for slot "left" in class "bicluster": got class "NULL", should be or extend class "Node" 

लेकिन अगर मैं डॉन ' टी डिफ़ॉल्ट रूप से डिफ़ॉल्ट मान नहीं है, तो डिफ़ॉल्ट मान गहराई 4 का एक पुनरावर्ती नोड होगा, जो मुझे लगता है कि संसाधन का कुछ अपशिष्ट है।

क्या मेरा विचार अनावश्यक है या क्या ऐसा करने का एक बेहतर तरीका है?

उत्तर

7

यह एक संशोधित उत्तर है।

कक्षा संघों का मज़ाकिया है - वे प्रभावी रूप से एक मौजूदा पदानुक्रम के बीच में एक कक्षा डालते हैं, इसलिए अचानक list का विस्तार करने वाली चीजें listOrNULL का विस्तार करती हैं।

इसके बजाय मैं एक छोटी कक्षा पदानुक्रम तैयार करता हूं जो "वृक्ष" का प्रतिनिधित्व करता है जो या तो "खाली" या "आंतरिक" हो सकता है। "आंतरिक" वर्ग में डेटा रखने के लिए एक स्लॉट होगा (प्रकार "कोई भी"), साथ ही बाएं और दाएं लिंक, जो "पेड़" तत्व होंगे।

setClass("Tree") 

setClass("Empty", contains="Tree") 

setClass("Internal", contains="Tree", 
     representation=representation(elem="ANY", left="Tree", right="Tree"), 
     prototype=prototype(left=new("Empty"), right=new("Empty"))) 

मैं एक खाली पेड़ बनाने के लिए विधियों, और एक तत्व से एक पेड़ के साथ साथ छोड़ दिया और सही वंशज के साथ अपने पेड़ के लिए एक निर्माता लिखते हैं, करेंगे।

setGeneric("Tree", function(elem, left, right) standardGeneric("Tree"), 
      signature="elem") 

setMethod(Tree, "missing", function(elem, left, right) new("Empty")) 

setMethod(Tree, "ANY", function(elem, left, right) { 
    new("Internal", elem=elem, left=left, right=right) 
}) 

एक बुनियादी आपरेशन एक पेड़ t

setGeneric("insert", function(x, t) standardGeneric("insert")) 

setMethod(insert, c("ANY", "Empty"), function(x, t) { 
    Tree(x, Tree(), Tree()) 
}) 

setMethod(insert, c("ANY", "Internal"), function(x, t) { 
    if (x < [email protected]) { 
     l <- insert(x, [email protected]) 
     r <- [email protected] 
    } else { 
     l <- [email protected] 
     r <- insert(x, [email protected]) 
    } 
    Tree([email protected], l, r) 
}) 

एक और आपरेशन सदस्यता

setGeneric("member", function(x, t) standardGeneric("member")) 

setMethod(member, c("ANY", "Empty"), function(x, t) FALSE) 

setMethod(member, c("ANY", "Internal"), function(x, t) { 
    if (x < [email protected]) member(x, [email protected]) 
    else if ([email protected] < x) member(x, [email protected]) 
    else TRUE 
}) 

के लिए एक दिलचस्प, कार्यात्मक, इस कार्यान्वयन की संपत्ति का परीक्षण करने के लिए है में एक तत्व x डालने के लिए है यह है कि यह लगातार

> t <- Tree() 
> t1 <- insert(10, t) 
> t2 <- insert(5, t1) 
> t3 <- insert(7, t2) 
> t4 <- insert(15, t3) 
> which(sapply(1:20, member, t4)) 
[1] 5 7 10 15 
> which(sapply(1:20, member, t2)) 
[1] 5 10 

एस 4 वर्ग निर्माण की अक्षमताओं की वजह से बहुत सारे अपडेट होने पर यह प्रभावी नहीं होगा और क्योंकि एक पेड़ को संशोधित करना (उदाहरण के लिए, नोड जोड़ना) नए नोड के पथ में सभी नोड्स की प्रतिलिपि बनाता है। different approach पेड़ को matrix बाएं, दाएं, मान ट्रिपल के रूप में दर्शाता है। एस 4 कार्यान्वयन में अभी भी खराब प्रदर्शन होगा, क्योंकि इंस्टेंस के अपडेट नए उदाहरण बनाएंगे, सबकुछ डुप्लिकेट करेंगे। तो मैं फ़ील्ड 'वैल्यू' के साथ एक रेफरेंस क्लास में समाप्त हो जाऊंगा (जो भी पेड़ पकड़ना है और matrix बाएं और दाएं रिश्तों के एक वेक्टर।

9

एक समय में आपको एक सूची के रूप में परिभाषित एक स्लॉट में न्यूल प्राप्त करने के लिए setClassUnion("listOrNULL",members=c("list", "NULL")) का उपयोग करने की आवश्यकता थी। मुझे लगता है कि अब एक उपलब्ध वर्ग है। आपके सेटअप अपूर्ण होने पर परीक्षण नहीं कर सकते हैं, लेकिन एक सुपर-क्लास "नोडऑर्न नूल" को परिभाषित करने से आप अपना प्रारंभिक बाधा निकाल सकते हैं।

+1

यह डेटा विश्लेषण के लिए सॉफ्टवेयर में चैंबर द्वारा अनुशंसित दृष्टिकोण (+1) – Henrik

+0

सही है, धन्यवाद – RockScience

+0

यह पूरी तरह से काम करता है, बहुत धन्यवाद – eblondel

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