2011-12-28 12 views
5

क्या कोई निम्नलिखित कोड समझा सकता है? मैं अपने खुद के संस्करण के साथ ग्राफिक्स पैकेज में लेआउट समारोह की जगह कर रहा हूँ, लेकिन यह फिर से दिखाई देने लगता है जादुईएक फ़ंक्शन को स्थायी रूप से बदलना

env = environment(graphics:::layout) 
unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# this still shows the original layout function! how is that possible? 
layout 

# this shows function(){} as expected 
graphics:::layout 
+0

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

+1

क्षमा न करें; मैंने खुद से बहुत कुछ सीखा है। मेरे पास यह नहीं है, लेकिन मैंने सुना है कि [चैंबर] (http://www.amazon.com/Software- डेटा- विश्लेषण- प्रोग्रामिंग- सांख्यिकी/डीपी/1441926127/ref=sr_1_9?s=books&ie = यूटीएफ 8 और क्यूआईडी = 1325110851 और एसआर = 1-9) पुस्तक आर प्रोग्रामिंग (सांख्यिकीय कंप्यूटिंग के विपरीत) बाइबल की तरह है। – joran

+0

मैंने वास्तव में एक घंटा पहले उस पुस्तक का आदेश दिया था। =) इसे नीचे इंतजार नहीं कर सकता। प्रोत्साहन के शब्दों के लिए धन्यवाद, जोरन! – SFun28

उत्तर

6

समस्या यह है कि आप ग्राफिक्स नाम स्थान को layout के अपने नए संस्करण बताए रहे हैं, जो environment(graphics:::layout) द्वारा वापस किया जाता है। इसके बजाय संलग्न ग्राफिक्स पैकेज (यानी आपके खोज पथ पर "package:graphics" के रूप में दिखाई देने वाला वातावरण) में असाइनमेंट करना चाहते हैं।

अपने उदाहरण में, जब layout की तलाश में, आर नीचे search() द्वारा दिया संलग्न पैकेजों की सूची खोज करता है, और इससे पहले कि यह कभी आप namespace:graphics में निर्दिष्ट किया है और कार्य करने के लिए हो जाता है package:graphics में मूल layout पाता है,।

समाधान, सरल है पहली पंक्ति में env करने के लिए सौंपा पर्यावरण के केवल एक परिवर्तन की आवश्यकता होती है:

# Assign into <environment: package:graphics> 
# rather than <environment: namespace:graphics> 
env <- as.environment("package:graphics") 

unlockBinding("layout" , env = env) 
assign("layout" , function(){} , envir = env) 
lockBinding("layout" , env = env) 

# Now it works as expected 
layout 
# function(){} 

एक थोड़ा और अधिक विस्तार, कुछ करने के लिए उपयोगी हो सकता है कि:

search() # Shows the path along which symbols typed at the command 
      # will be searched for. The one named "package:graphics" 
      # is where 'layout' will be found. 

# None of these return the environment corresponding to "package graphics" 
environment(layout) 
environment(graphics::layout) 
environment(graphics:::layout) 

# This does 
as.environment("package:graphics") 
+0

धन्यवाद, जोश! तो 'env = पर्यावरण (ग्राफिक्स ::: लेआउट) क्यों काम नहीं करता है लेकिन' env <- as.environment ("पैकेज: ग्राफिक्स") 'करता है? – SFun28

+1

'असाइनइन नामस्थान' भी देखें - यदि आप S3 विधियों को बदलना चाहते हैं तो चीजें अधिक जटिल हो जाती हैं। – hadley

+0

@ SFun28: पहला आपको नामस्थान वातावरण प्राप्त करता है जो केवल ग्राफिक्स का उपयोग करता है, दूसरा आपको ग्राफिक्स पैकेज वातावरण प्राप्त करता है जो बाकी सब कुछ उपयोग करता है। (मुझे यकीन नहीं है कि इससे ग्राफिक्स आयात करने वाले अन्य संलग्न पैकेजों को कैसे प्रभावित किया जाएगा) – hadley

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