2015-01-09 5 views
8

यदि आप एक सामान्य फ़ंक्शन के अंदर एक चर परिभाषित करते हैं, तो यह विधि के लिए उपलब्ध है। उदाहरण के लिए:सामान्य कार्यों में दायरा R

g <- function(x) { 
    y <- 2 
    UseMethod("g") 
} 
g.default <- function() y 
g() 
[1] 2 

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

g <- function(x) { 
    x <- 2 
    UseMethod("g") 
} 
g.default <- function() x 
g() 
Error in g.default() : object 'x' not found 

क्या कोई यह बता सकता है कि यहां क्या हो रहा है?

उत्तर

4

C source file that defines do_usemethod से निम्नलिखित टिप्पणियां कम से कम संकेत दे रही हैं कि क्या हो रहा है। विशेष रूप से दूसरी गणना आइटम की दूसरी वाक्य देखें।

असल में, ऐसा लगता है (उस दूसरे बिंदु में नियम के गूंगा आवेदन के कारण), x का मान कॉपी नहीं होता है क्योंकि सी कोड यह देखने के लिए जांच करता है कि यह औपचारिक रूप से है या नहीं, यह देखता है कि यह है, और इसलिए विधि के मूल्यांकन वातावरण में डाले गए चर की सूची से बाहर रखा गया है।

/* usemethod - calling functions need to evaluate the object 
* (== 2nd argument). They also need to ensure that the 
* argument list is set up in the correct manner. 
* 
* 1. find the context for the calling function (i.e. the generic) 
* this gives us the unevaluated arguments for the original call 
* 
* 2. create an environment for evaluating the method and insert 
* a handful of variables (.Generic, .Class and .Method) into 
* that environment. Also copy any variables in the env of the 
* generic that are not formal (or actual) arguments. 
* 
* 3. fix up the argument list; it should be the arguments to the 
* generic matched to the formals of the method to be invoked */ 
+0

मैं मानता हूं कि यही कारण है कि यह हो रहा है। लेकिन अगर आप जेनेरिक को भेज रहे हैं, तो उस वस्तु को संशोधित करना चाहते हैं, तो आपको इसे 'UseMethod() 'के दूसरे पैरामीटर के रूप में पास करना चाहिए। साथ ही, यह अच्छा होगा अगर आप सामान्य कार्यान्वयन को कम से कम एक आम पहला तर्क साझा करते हैं। यह अजीब बात है कि 'g.default()' में पैरामीटर नहीं है। यह वह जगह है जहां कोई संशोधित 'x' पास करने की अपेक्षा करेगा। – MrFlick

+0

@MrFlick - लेकिन जैसा कि आप देख सकते हैं, यहां तक ​​कि 'UseMethod' के लिए दूसरा तर्क भी पास नहीं होता है। यह केवल यह निर्धारित करने के लिए प्रयोग किया जाता है कि कौन सी विधि प्रेषित की जानी चाहिए (जो कि किसी भी मामले में आपको जेनेरिक फ़ंक्शन कॉल से जो चीज़ चाहिए, उसे लगता है)। मैं कई तरीकों की तर्क सूचियों को कैसे व्यवस्थित करने के बारे में आपकी सामान्य सिफारिश से सहमत हूं। –

+0

@MrFlick - मुझे यह मानना ​​है कि अब तक मैंने इसकी सराहना नहीं की है कि आप * * * कर सकते हैं, यदि आप चाहते हैं, तो कई प्रयोग किए गए तर्कों के मूल्यों के आधार पर प्रेषण के लिए 'UseMethod() 'का उपयोग करें (अधिक एस 4 कक्षाओं के साथ क्या होता है)। इसे जेनेरिक के शरीर में थोड़ी या प्रीप्रोकैसिंग की आवश्यकता होगी, लेकिन ऐसा लगता है कि इसे पूरा करना मुश्किल नहीं होगा। मुझे आश्चर्य है कि इसका उपयोग किसी भी प्रसिद्ध आर पैकेज में किया जाता है। –

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