2012-09-22 21 views
7

मैं वर्तमान में संदर्भ कक्षाओं का उपयोग कर एक पैकेज लिख रहा हूं।संदर्भ कक्षाएं, टैब पूर्णता और मजबूर विधि परिभाषा

Method initialisation in R reference classes

Can't reliably use RefClass methods in Snowfall

मैं इकट्ठा के कारण होता है क्योंकि संदर्भ तरीकों सब हर कॉपी नहीं हुए हैं कक्षा में आपत्ति नहीं बल्कि वे हैं: मैं जो विभिन्न स्रोतों पढ़ने से किसी समस्या का सामना आए हैं पहली बार पहुंचे जब कॉपी किया गया।

https://stat.ethz.ch/pipermail/r-devel/2011-June/061261.html

एक उदाहरण के रूप को परिभाषित:

test <- setRefClass("TEST", 
       fields = list(a = "numeric"), 
       methods = list(
        addone = function(){ 
             a <<- a+1 
             }, 
        initialize = function(){ 
              a <<- 1 
              } 
          ) 
       ) 

example <- test$new() 

इसलिए उदाहरण के वर्ग TEST की एक नई वस्तु है। टाइपिंग example$ और कंसोल में टैब

> example$ 
# example$.->a   example$.refClassDef example$.self   
# example$a   example$initialize 

तो विधि addone एक विकल्प के रूप में प्रस्तुत नहीं किया गया है देता है। यह कॉल तथापि के लिए उपलब्ध है:

example$addone() 

अब टैब फिर से

# > 
# > example 
# Reference class object of class "TEST" 
# Field "a": 
# [1] 2 
# > example$ 
# example$.->a   example$.refClassDef example$.self   
# example$a   example$addone  example$field   
# example$initialize example$show 

तो अब addone और field और show विकल्प के रूप में प्रस्तुत कर रहे हैं पता चलता है।

मार्टिन मॉर्गन उपरोक्त लिंक में से किसी एक में विधियों की परिभाषा को बल देने की सलाह देता है। यह काम करता है अच्छी तरह से

test <- setRefClass("TEST", 
       fields = list(a = "numeric"), 
       methods = list(
        addone = function(){ 
             a <<- a+1 
             }, 
        initialize = function(){ 
              a <<- 1 
              .self$addone #force definition 
              } 
          ) 
       ) 

example <- test$new() 

तो अब tabbing देता है:

# > example$ 
# example$.->a   example$.refClassDef example$.self   
# example$a   example$addone  example$initialize 

मेरी कक्षाओं में से कुछ 30 से अधिक तरीकों तो मैं के रूप में succintly संभव के रूप में यह करने के लिए करना चाहते हैं। मैं परिभाषित किया है:

test <- setRefClass("TEST", 
       fields = list(a = "numeric"), 
       methods = list(
        addone = function(){ 
             a <<- a+1 
             }, 
        initialize = function(){ 
         a <<- 1 
         eval(parse(text=paste0('.self$',ls([email protected])))) 
              } 
          ) 
       ) 

example <- test$new() 

टैब अब देता है:

# > example$ 
# example$.->a   example$.refClassDef example$.self   
# example$a   example$addone  example$callSuper  
# example$copy   example$export  example$field   
# example$getClass  example$getRefClass example$import  
# example$initFields example$initialize example$show   
# example$trace  example$untrace  

जबकि इस काम करता है यह थोड़ा अनाड़ी लगता है। [email protected] का उपयोग getRefClass("TEST")[email protected] के बजाय किया जाता है ताकि थोड़ा गलत महसूस हो। क्या किसी ने इस मुद्दे से पहले निपटाया है।

क्या समाधान से संपर्क करने का कोई बेहतर तरीका है? यदि सवाल अत्यधिक निकाला जाता है तो किसी भी सलाह और माफ़ी के लिए धन्यवाद।

उत्तर

6

मुझे आश्चर्य है कि आपका उद्देश्य क्या है? फ़ंक्शन नाम टैब पूर्ण होने के साथ दिख रहे हैं? फिर यह फीचर अनुरोध के साथ आर-डेवेल मेलिंग सूची में एक पोस्ट के लायक है। ?setRefClass पर दस्तावेज के रूप में मूल परिदृश्य usingMethods के साथ अधिक सुंदर ढंग से संभाला गया है।एक जारी रखा हैक

initialize = function(...) { 
    methods <- getRefClass(class(.self))$methods() 
    eval(parse(text=paste0(".self$", methods))) 
    callSuper(...) 
} 

टैब पूर्ण करने utils पैकेज में .DollarNames के माध्यम से अनुकूलित किया जा सकता है, तो

.DollarNames.TEST <- function(x, pattern) 
    grep(pattern, getRefClass(class(x))$methods(), value=TRUE) 

हो सकता है कि एक S3 विधि इस बात के लिए अपने वर्ग पदानुक्रम के आधार पर लिखा जा सकता है हो सकता है?

+0

धन्यवाद कि मेरे समाधान से बहुत उपयोगी और अधिक सुरुचिपूर्ण है। इसके अलावा मुझे नहीं पता था कि इसे टैब पूर्ण करने के लिए कहा गया था। इस शब्द को जानने से मुझे यूटिल में प्रासंगिक पैकेज ढूंढने में मदद मिली। संदर्भ कक्षाओं के साथ टैब पूर्णता मेरा उद्देश्य था और मैं इसे बेहतर ढंग से प्रतिबिंबित करने के लिए प्रश्न शीर्षक संपादित करूंगा। – jdharrison

+0

यह बहुत ही आशाजनक प्रतीत होता है। क्या यह 'DollarNames.envRefClass <- फ़ंक्शन (एक्स, पैटर्न) grep (पैटर्न, getRefClass (कक्षा (x)) $ विधियों(), value = TRUE) को जोड़ने के लिए एक बुरा विचार होगा? मेरे पैकेज में? – jdharrison

+0

हां, यह एक बुरा विचार होगा - आप केवल अपने ही नहीं, बल्कि सभी संदर्भ वर्गों के लिए व्यवहार बदल देंगे। शायद कुछ वर्तमान व्यवहार की तरह, संभवतया 'विधियों' कुछ भविष्य की तारीख में एक सुपर-डुप्लिकर 'डोलरनाम.एएनवीआरफ क्लास' लागू करेंगे और आपकी लंबी भूल गई विधि फिर इसे ओवरराइड कर देगी। ऐसा करने के लिए सही बात यह है कि आर-डेवेल पर फीचर अनुरोध के रूप में इसे लाने के लिए, विशेष रूप से अब आपके पास उचित व्यवहार करने वाले व्यवहार को चित्रित करने के लिए कम से कम एक कामकाजी प्रोटोटाइप है। –

1

@ मार्टिन मॉर्गन ने नोट किया कि इसे टैब पूर्ण करने के लिए कहा गया था। पैकेज rcompletion और बाद में rcompgen को इसे प्राप्त करने के साथ कार्य किया गया था। अब उन्हें utils पर ले जाया गया है।

rcompletion update

मैं completion.R के लिए और मैं क्या यह समझ सकते हैं utils:::.DollarNames.environment संदर्भ कक्षाओं के लिए टैब पूरा होने से निपटने था से कोड के माध्यम से देखा।

assignInNamespace(x = ".DollarNames.environment", 
        function(x, pattern = "") { 
    y <- NULL 
    if(isS4(x) && !is.null(x[['.refClassDef']])){ 
     if(.hasSlot(x$.refClassDef,'refMethods')){ 
     y<[email protected] 
     y<-ls(y, all.names = TRUE, pattern = pattern) 
     } 
    } 
    x<-ls(x, all.names = TRUE, pattern = pattern) 
    unique(c(x,y)) 
               } 
,ns = "utils") 

कुछ बातें ध्यान रखें::

  • मैं सिर्फ अपने स्वयं के उपयोग के लिए इस का प्रयोग करेंगे

    completion.R

    समारोह पुनर्परिभाषित टैब पूरा होने को प्राप्त करने लग रहा था। वर्तमान में मैं एक पैकेज डिबगिंग और दस्तावेज कर रहा हूं। मेरे पास कुछ लम्बी विधि के नाम थे और उन्हें याद नहीं आया कि वे क्या कर रहे थे ताकि टैब पूरा हो सके।

  • पैकेज में assignInNamespace का उपयोग (यदि प्रतिबंधित नहीं है) ?assignInNamespace पर फेंक दिया गया है।

  • विधियों की जबरन परिभाषा अधिक सलाह दी जाती है।

+0

असल में, 'डोलरनाम' एक एस 3 जेनेरिक है ताकि आप उस पर एस 3 विधियां लिख सकें; मैंने इसे अपने जवाब में सचित्र किया। –

3

मैं जानता हूँ कि यह एक पुराने सवाल यह है लेकिन यह अभी भी शीर्ष प्रविष्टि जब गूगल पर refClass टैब पूरा करने के लिए खोज कर रहा है, तो मैं बस एक अद्यतन जोड़ देंगे:

बजाय में ग्रेप का उपयोग करने का। DollarNames समारोह के रूप में मार्टिन ने सुझाव दिया, utils संकुल से उपयोग findMatches के रूप में यह अलग Rgui के चारों ओर के साथ खेलता है बेहतर (ग्रेप मार टैब पर अपने आंशिक रूप से टाइप किया नाम को हटा दिया जाएगा)

.DollarNames.TEST <- function(x, pattern){ 
    utils:::findMatches(pattern, getRefClass(class(x))$methods()) 
} 

यह भी कैसे टैब पूरा होने के आंतरिक रूप से नियंत्रित किया जाता है है सूचियों और डेटा के लिए। फ्रेम