2010-10-01 20 views
14

यह प्रश्न अन्य प्रश्नों की एक श्रृंखला से आता है जो सभी आवश्यक रूप से एक ही समस्या से निपटते हैं। कुछ अजीब कारणों से, किसी अन्य फ़ंक्शन के भीतर फ़ंक्शन का उपयोग करने से कभी-कभी इस अर्थ में विफल रहता है कि पहले फ़ंक्शन के स्थानीय वातावरण में परिभाषित चर दूसरे फ़ंक्शन में वापस नहीं पाए जाते हैं।आर 2.11.1 में स्कॉइंग और फ़ंक्शंस: क्या गलत हो रहा है?

छद्म कोड में शास्त्रीय पैटर्न: eval में

ff <- function(x){ 
    y <- some_value 
    some_function(y) 
} 
ff(x) 

त्रुटि (expr, माहौल, enclos): वस्तु 'y' नहीं

पाया पहले मैंने सोचा कि यह था एस 4 विधियों और वहां स्कॉइंग के साथ कुछ करने के लिए, लेकिन यह अन्य कार्यों के साथ भी होता है। मैंने आर विकास टीम के साथ कुछ बातचीत की है, लेकिन उन्होंने जो कुछ किया वह मुझे बग रिपोर्ट साइट पर भेज दिया गया था (जो सबसे ज्यादा आमंत्रित नहीं है, मुझे कहना है)। मुझे कोई प्रतिक्रिया नहीं मिली।

जैसे ही समस्या उत्पन्न होती रहती है, मुझे आश्चर्य है कि इसके लिए तर्क तर्क है या नहीं। क्या इन सभी मामलों में यह एक आम गलती है, और यदि हां, तो कौन सा? या यह वास्तव में एक बग है?

उन प्रश्नों में से कुछ:

पुनश्च: मैं जानता हूँ कि आर-डेवेल सूची, यदि आपको आश्चर्य हुआ ...

+0

मुझे इस पर आपका कामकाज पसंद है http://stackoverflow.com/questions/3742415/r-statistic-scoping-error-using-transformby-part-of-the-doby-package –

+0

मैंने आर-डेवेल से भी संपर्क किया , और वहां मुझे @ रिची, @ जोनाथन के बारे में बताया गया था, और @ हैडली ने मुझे बताया। मूल्यवान उत्तरों के लिए सभी को Thx। –

उत्तर

3

जैसा कि डिर्क ने अपने उत्तर में उल्लेख किया है, वास्तव में आपके द्वारा पोस्ट किए गए कोड के साथ कोई समस्या नहीं है। आपके द्वारा प्रश्न में पोस्ट किए गए लिंक में, एक आम विषय प्रतीत होता है: some_function में कोड है जो किसी भी तरह से वातावरण के साथ गड़बड़ करता है।यह खिलवाड़ new.env और with या परोक्ष, का उपयोग कर एक data तर्क, शायद की तरह

y <- eval(substitute(y), data) 

कहानी का नैतिक दोहरा है एक लाइन का उपयोग करते हैं, या तो स्पष्ट है। सबसे पहले, स्पष्ट रूप से वातावरण में हेरफेर करने से बचने की कोशिश करें, जब तक कि आप वास्तव में सुनिश्चित न हों कि आप जानते हैं कि आप क्या कर रहे हैं। और दूसरी बात, यदि किसी फ़ंक्शन में डेटा तर्क होता है तो उस डेटा फ्रेम के अंदर उपयोग करने के लिए आपको आवश्यक सभी चर डाल दें।

+0

जैसा कि मैंने डिर्क का उत्तर दिया, मुझे पता है कि उस कोड में कोई समस्या नहीं है। यह सिर्फ एक उदाहरण था। जवाब के लिए Thx, जो मुझे लगता है कि यह काफी अच्छी तरह से लगता है। और टिप के लिए thx, यह निश्चित रूप से मुझे बहुत निराशा से बच जाएगा। स्वीकार किए जाते हैं। –

4

निस्संदेह आर में कीड़े हैं, लेकिन बहुत से मुद्दे जो लोग हैं, some_function के कार्यान्वयन में अक्सर त्रुटियां हैं, आर नहीं। आर में स्कॉइंग नियम हैं (http://cran.r-project.org/doc/manuals/R-intro.html#Scope देखें) जो फ़ंक्शन तर्कों के आलसी मूल्यांकन के साथ संयुक्त होते हैं और eval अन्य स्कॉप्स में तर्क अत्यधिक शक्तिशाली होते हैं लेकिन जो अक्सर सूक्ष्म त्रुटियों का कारण बनते हैं।

0

वैसे वहाँ क्या आप पोस्ट में कोई समस्या नहीं है:

/tmp$ cat joris.r 
#!/usr/bin/r -t 

some_function <- function(y) y^2 

ff <- function(x){ 
    y <- 4 
    some_function(y) # so we expect 16 
} 
print(ff(3))   # 3 is ignored 
$ ./joris.r 
[1] 16 
/tmp$ 

आप को फिर से और postan वास्तविक बग या misfeature सकते हैं?

+0

उन्होंने 5 उदाहरणों के लिंक प्रदान किए। –

+0

कूल, अगला क्या है। संदर्भ * बस जाओ और इसे intertubes पर खुद को देखो *? क्षमा करें, कंक्रीट और मूर्त प्रश्नों के लिए ठोस मदद। जोरीस बहुत स्मार्ट कुकी है, और मुझे स्पष्ट प्रश्नों में मदद करने के लिए खुशी होगी। –

+1

मेरा प्रश्न पांच बग के बीच के लिंक के बारे में है। मैं वास्तव में वहां आयोजित पूरी चर्चा को कॉपी-पेस्ट नहीं कर सका, क्या मैं कर सकता था? –

5

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

यह भी देखें: standard non-standard evaluation rules

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

  • कोई संबंधित समस्या नहीं^_^