2016-02-01 8 views
8

मैं पोलिश अंकन के साथ एक समारोह के रूप [<- इस्तेमाल करने वाले लोगों के एक जोड़े को देखा है, उदाहरण के'[<-` फ़ंक्शन आर में कैसे काम करता है?

x <- matrix(1:4, nrow = 2) 
`[<-`(x, 1, 2, 7) 

जो रिटर्न

 [,1] [,2] 
[1,] 1 7 
[2,] 2 4 

मैं चारों ओर [<- साथ एक छोटी सी खेलने की कोशिश की है के लिए, और यह ऐसा लगता है कि इस तरह इसका उपयोग करने के लिए वास्तव में असाइनमेंट किए बिना x[1,2] <- 7 जैसे कुछ के परिणाम प्रिंट करता है। लेकिन मैं यह सुनिश्चित करने के लिए नहीं समझ सकता कि यह फ़ंक्शन वास्तव में क्या करता है, क्योंकि ?"[" के लिए दिए गए दस्तावेज़ केवल इसे पास करने में उल्लेख करते हैं, और मैं "[< -" के लिए Google या SO खोज नहीं सकता।

और हाँ, मुझे पता है कि वास्तव में का उपयोग कर यह शायद एक भयानक विचार है, मैं आर

+2

यह आर की तरह अधिक है [x2] <- 7' 'x <-' [<- '(x, 1, 2, 7) '। – joran

+0

यदि आप '[' फ़ंक्शन और '<-' फ़ंक्शन को समझते हैं, तो' [<-' फ़ंक्शन बहुत समझ में आता है। कोशिश करें '[(एक्स, 1,2) '। कोशिश करें '<- (ए, 1) ' –

+2

मैं इसे एक डुप्लिकेट नहीं देख रहा हूं। मैं _thought_ सवाल यह है कि क्यों '[<-' वास्तव में प्रतीक/नामित वस्तु 'x' में उप-असाइनमेंट को प्रभावित नहीं करता है। यह मनोनीत डुप्लिकेट में उत्पन्न प्रश्न नहीं प्रतीत होता था। –

उत्तर

4

का एक बेहतर समझ के लिए बस उत्सुक हूँ यह आपको प्राप्त करने के लिए क्या करने की जरूरत क्या है काम रहना:

`<-`( `[`( x, 1, 2), 7) # or x <- `[<-`( x, 1, 2, 7) 
x 
    [,1] [,2] 
[1,] 1 7 
[2,] 2 4 

अनिवार्य रूप से क्या हो रहा है कि [x की पंक्ति-col स्थान में एक सूचक और उसके बाद <- (जो वास्तव में है कि यह भी एक इन्फ़िक्स संकेतन में इस्तेमाल किया जा सकता assign के लिए एक पर्याय है पैदा कर रही है है) कर रहा है वास्तविक "स्थायी" असाइनमेंट जी। यह सोचने में गुमराह न करें कि यह कॉल-बाय-रेफरेंस असाइनमेंट है। मुझे यकीन है कि अभी भी x बनाया गया अस्थायी मान होगा।

आपके संस्करण ने एक सबसिग्निमेंट किया है (जैसा कि यह लौटाया गया है) के रूप में देखा जा सकता है लेकिन यह असाइनमेंट केवल [<- पर कॉल के स्थानीय वातावरण में था, जिसमें वैश्विक वातावरण शामिल नहीं था।

+0

क्या x x [1,2] <- 7' तब कॉल-बाय-रेफरेंस है? – fishtank

+0

नहीं।इससे एक अस्थायी मूल्य भी बन जाएगा। अधिकांश "नियमित आर" असाइनमेंट वादे द्वारा कॉल किए जाते हैं जो संदर्भ द्वारा कॉल की तुलना में कॉल-बाय-वैल्यू की तरह अधिक है। 'Data.table' पैकेज अपनी वस्तुओं के स्थान पर संशोधन करता है। ऑब्जेक्ट्स पर अधिक सीधी पहुंच प्रदान करने और ओवरहेड की प्रतिलिपि रोकने से रोकने के लिए आर 6 तंत्र स्थापित किया गया था। –

2

`[`(x, y) के बाद से स्लाइस एक वस्तु, और `<-`(x, z) प्रदर्शन काम, ऐसा लगता है `[<-`(x,y,z) की तरह काम x[y] <- y प्रदर्शन करेंगे। @ 42-का उत्तर [<- वास्तव में क्या करता है, इसकी एक महान व्याख्या है, और `levels<-`(What sorcery is this? का शीर्ष उत्तर कुछ अंतर्दृष्टि प्रदान करता है कि आर इस तरह से क्यों काम करता है।

क्या [<- वास्तव में हुड के नीचे करता है देखने के लिए, आप सी स्रोत कोड, [<- के लिए http://svn.r-project.org/R/trunk/src/main/subassign.c में पाया जा सकता है जो जाना है (प्रासंगिक भागों लाइन 1470 के आसपास से शुरू)। आप देख सकते हैं कि x, "असाइन किया गया" ऑब्जेक्ट सुरक्षित है ताकि केवल स्थानीय संस्करण को उत्परिवर्तित किया जा सके। इसके बजाए, हम स्थानीय रूप से असाइनमेंट करने और फिर परिणाम लौटने के लिए वेक्टर एस्सिग, मैट्रिक्सएस्सिग, ऐरेएस्साइन इत्यादि का उपयोग कर रहे हैं।

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