मैं एक आर पैकेज का उपयोग कर रहा हूं, जिसमें 2 फ़ंक्शंस एफ 1 और एफ 2 (एफ 2 कॉलिंग एफ 1 के साथ)
मैं फ़ंक्शन f1 को ओवरराइट करना चाहता हूं।आर: पैकेज से किसी फ़ंक्शन को ओवरराइट करने का सही तरीका क्या है?
चूंकि 2.15 और पैकेज में नेमस्पेस का अनिवार्य उपयोग, यदि मैं केवल नए फ़ंक्शन को स्रोत करता हूं, तो यह वास्तव में वैश्विक वातावरण में उपलब्ध है (यानी कंसोल में केवल f1 (x) को कॉल करना नया परिणाम देता है)। हालांकि, कॉलिंग f2 अभी भी पैक किए गए फ़ंक्शन f1 का उपयोग करेगा। (क्योंकि नेमस्पेस खोज पथ को संशोधित करता है, और इसे here in the Writing R Extensions ट्यूटोरियल समझाया गया है)
नए के साथ f1 को पूरी तरह से बदलने का उचित तरीका क्या है? (पैकेज को फिर से बनाने के अलावा!) यह कई स्थितियों में उपयोगी हो सकता है। उदाहरण के लिए यदि पैकेज में कोई बग है जिसे आपने विकसित नहीं किया है। या यदि आप अभी भी विकास के दौरान अपने पैकेजों को फिर से बनाना नहीं चाहते हैं।
मैं समारोह के बारे में पता
assignInNamespace("f1",f1,ns="mypackage")
हालांकि, मदद पृष्ठ ?assignInNamespace
थोड़ा enignmatic है और अधिक जानकारी दिए बिना इसका उपयोग करने से लोगों को हतोत्साहित करने के लिए लगता है, और मैं इस पर कोई सर्वश्रेष्ठ व्यवहार सुझाव नहीं पा सके आधिकारिक सीआरएएन ट्यूटोरियल। और इस फ़ंक्शन को कॉल करने के बाद:
# Any of these 2 calls return the new function
mypackage::f1
getFromNamespace(x = "f1", envir = as.environment("package:mypackage"))
# while this one still returns the old packaged version
getFunction(name = "f1", where = as.environment("package:mypackage"))
यह बहुत परेशान है। खोज पथ कैसे प्रभावित होता है?
अब मैं ऐसे lockEnvironment
समारोह को संशोधित करने के लिए इतना है कि library
पैकेज नाम स्थान को लॉक नहीं करता, और मैं इसे बाद के चरण एक बार मैं F1 जगह ले ली है पर लॉक कर सकते हैं (जो वास्तव में एक अच्छा नहीं लगता है के रूप में कुछ बदसूरत बातें कर रहा हूँ के लिए
- वास्तव में क्या एक पैकेज नाम स्थान (जो माना जाता है के मामले में
assignInNamespace
क्या करता है बंद किया जा करने के लिए) - अच्छा अभ्यास क्या हैं: अभ्यास)
तो मूल रूप से मैं 2 प्रश्न हैं?
आपके अनुभव को साझा करने के लिए बहुत धन्यवाद।
संपादित करें: इस प्रश्न में रुचि रखने वाले लोगों को this blog post बहुत दिलचस्प लगता है।
महान प्रश्न। मैं हाल ही में स्पष्टीकरण की खोज कर रहा हूं, इस विषय पर एक [पुराना धागा] (https://stat.ethz.ch/pipermail/r-help/2008-August/171217.html) पाया गया है, जो प्रासंगिक प्रतीत होता है । – tonytonov
@tonytonov आप के लिए धन्यवाद लिंक। मुझे यह समझने में कामयाब नहीं रहा कि पैकेज के मामले में 'अनलॉक बाइंडिंग' क्या कर रहा था। ऐसा लगता है कि केवल 'असाइनइन नेमस्पेस' करने से बिल्कुल वही परिणाम हो रहा है। कोई सुराग? – RockScience
वास्तव में नहीं। मेरे अनुभव के अनुसार, 'असाइनइन नामस्थान' काम करता है या पैकेज के आधार पर काम नहीं करता है, और मुझे नहीं पता कि ऐसा क्यों होता है। यदि यह विफल रहता है, तो 'अनलॉक बाइंडिंग' से युक्त समाधान या तो काम नहीं करता है। – tonytonov