2012-05-23 20 views
14

मुझे आश्चर्य है कि आर भाषा में असाइनमेंट कैसे काम करता है।आर भाषा में असाइनमेंट

> x <- c(5, 6, 7) 
> x[1] <- 10 
> x 
[1] 10 6 7 
> 

जो मैं पूरी तरह समझ में:

निम्नलिखित आर खोल सत्र पर विचार करें। वेक्टर (5, 6, 7) बनाया गया है और प्रतीक 'एक्स' से बना है। बाद में, 'एक्स' नए वेक्टर (10, 6, 7) के लिए रिबाउंड है क्योंकि वेक्टर अपरिवर्तनीय डेटा संरचनाएं हैं।

लेकिन यहाँ क्या होता है:

> c(4, 5, 6)[1] <- 10 
Error in c(4, 5, 6)[1] <- 10 : 
    target of assignment expands to non-language object 
> 

या यहाँ:

> f <- function() c(4, 5, 6) 
> f()[1] <- 10 
Error in f()[1] <- 10 : invalid (NULL) left side of assignment 
> 

मुझे ऐसा लगता है कि एक ही नाम पर रखा गया डेटा संरचनाओं को मान निर्दिष्ट कर सकते हैं ('एक्स' की तरह)।

कारण मैं पूछ रहा हूं क्योंकि मैं आर भाषा कोर को लागू करने का प्रयास करता हूं और मैं इस तरह के असाइनमेंट से निपटने के लिए अनिश्चित हूं।

अग्रिम

+1

एक बड़ा सवाल है कि। आपको यहां कुछ उत्तरों में अंतर्दृष्टि मिल सकती है: http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this –

उत्तर

16

ऐसा लगता है कि कोई केवल नामित डेटा संरचनाओं (जैसे 'x') को मान निर्दिष्ट कर सकता है।

ठीक है यही कारण है कि ?"<-" के लिए दस्तावेज़ का कहना है:

विवरण:

Assign a value to a name. 

x[1] <- 10x <- c(5, 6, 7) रूप में एक ही समारोह का उपयोग नहीं करता। पूर्व [<- कॉल करता है जबकि उत्तरार्द्ध <- पर कॉल करता है।

+1

आह ठीक है।लेकिन पार्सर भिन्न हो प्रतीत नहीं होता है के बीच x <- 2 और एक्स [1] <- 2 'canonical' समारोह मुझे ' <-' (एक्स, 2) देता है क्योंकि और '<-' (' ['(x, 1), 2) तो मुझे लगता है कि दुभाषिया किसी भी तरह से अंतराल पर प्रेषित करता है। –

14

धन्यवाद आप गुमनाम कार्यों के लिए संशोधन कर सकता है, लेकिन वहाँ गुमनाम वैक्टर करने के लिए कोई काम है। यहां तक ​​कि आर नामों के साथ अस्थायी प्रतियां बनाता है और आपको कभी-कभी त्रुटि संदेश दिखाई देंगे जो उस तथ्य को दर्शाते हैं। आप पृष्ठ 21 पर R language definition में यह पढ़ सकते हैं जहां यह "सबसेट काम" के लिए अभिव्यक्ति के मूल्यांकन के साथ और काम के अन्य रूपों के लिए संबंधित है:

x[3:5] <- 13:15 
# The result of this commands is as if the following had been executed 
`*tmp*` <- x 
x <- "[<-"(`*tmp*`, 3:5, value=13:15) 
rm(`*tmp*`) 

और वहाँ एक चेतावनी एक वस्तु नाम के रूप में उपयोग करने के लिए नहीं है *tmp* क्योंकि यह अगले कॉल के दौरान [<-

15

@ ओवेन के जवाब के अनुसार this question, x[1] <- 10 वास्तव में दो चीजें कर रहा है। यह [<- फ़ंक्शन को कॉल कर रहा है, और यह उस कॉल का परिणाम एक्स को असाइन कर रहा है।

तो क्या आप अपने c(4, 5, 6)[1] <- 10 परिणाम हासिल करना चाहते हैं:

> `[<-`(c(4, 5, 6),1, 10) 
[1] 10 5 6 
+0

'<-' फ़ंक्शन वास्तव में एक इंफिक्स फ़ंक्शन है जो 2+ तर्क ले सकता है, जिसमें से पहला _always_ एक असली आर नाम है (वर्ण वेक्टर नहीं)। –

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