2012-03-24 9 views
10

मैंने HERE पर चर्चा का पालन किया और उत्सुक हूं कि <<- का उपयोग क्यों कर रहा है आर में किस तरह का भ्रम पैदा होगा?`<< - 'का उपयोग क्यों कर रहा है और मैं इससे कैसे बच सकता हूं?

मैं भी मैं <<- कैसे बच सकते हैं पर कुछ सुझाव चाहते हैं। मैं अक्सर निम्नलिखित का उपयोग करता हूं। उदाहरण के लिए:

### Create dummy data frame of 10 x 10 integer matrix. 
### Each cell contains a number that is between 1 to 6. 
df <- do.call("rbind", lapply(1:10, function(i) sample(1:6, 10, replace = TRUE))) 

क्या मैं हासिल करना चाहते हैं 1 से हर नंबर नीचे शिफ्ट करने के लिए है, यानी सभी 2s 1s हो जाएगा, सभी 3s आने दिया जाएगा 2 आदि इसलिए, सभी nn-1 आने दी जाएगी।

df.rescaled <- df 
sapply(2:6, function(i) df.rescaled[df.rescaled == i] <<- i-1)) 

इस उदाहरण में, मैं कैसे <<- से बच सकते हैं: मैं का पालन करते हुए इस लक्ष्य को हासिल? आदर्श रूप में मैं पाइप करने में सक्षम की तर्ज पर एक और चर में sapply परिणाम होना चाहता हूँ जाएगा:,

df.rescaled <- sapply(...) 
+0

भी देखें http://stackoverflow.com/questions/14166207/avoiding-global-variables-in-r/14166812 लिंक के लिए # 14166812 –

उत्तर

16

प्रथम बिंदु

<<-नहीं ऑपरेटर वैश्विक चर के लिए आवंटित करने के लिए है। यह परिवर्तनीय को निकटतम पेरेंट वातावरण में असाइन करने का प्रयास करता है। तो, कहते हैं, इस भ्रम कर देगा:

f <- function() { 
    a <- 2 
    g <- function() { 
     a <<- 3 
    } 
} 

तो,

> a <- 1 
> f() 
> a # the global `a` is not affected 
[1] 1 

दूसरा बिंदु

आप ऐसा कर सकते हैं Reduce का उपयोग करके:

Reduce(function(a, b) {a[a==b] <- a[a==b]-1; a}, 2:6, df) 

या apply

apply(df, c(1, 2), function(i) if(i >= 2) {i-1} else {i}) 

लेकिन

बस, इस के लिए पर्याप्त है:

ifelse(df >= 2, df-1, df) 
+0

मेरे कोड के विकल्प के लिए धन्यवाद। बहुत सराहना की। क्या आप कम से कम फ़ंक्शन पर विस्तार कर सकते हैं? मैं पढ़ने के बाद भी अपने तर्क प्रवाह के बारे में बहुत स्पष्ट नहीं हूँ? कम करें। मैं समझ सकता हूं कि आप 2 चर के साथ कम करने के भीतर एक फ़ंक्शन बनाने की कोशिश कर रहे हैं। सभी के लिए 'ए' में जहां यह '==' से 'बी' शून्य '1' है।उसके बाद एक 'ए' है और शेष वाक्यविन्यास जिसमें से मैं खो गया हूं – JackeJR

+0

'घटाएं' को 'फोल्ड' के रूप में भी जाना जाता है, जो कार्यात्मक प्रोग्रामिंग में लोकप्रिय विधि है। यहां एक सरल व्याख्या है। [विकिपीडिया] (http://en.wikipedia.org/wiki/Fold_ (उच्च-आदेश_फंक्शन)) – kohske

+0

आगे की चर्चा के लिए, देखें: http://stackoverflow.com/a/10904810/2338862 – Thomas

5

आप <<- वैश्विक काम (लगभग के रूप में के बारे में सोच सकता है, क्योंकि के रूप में kohske अंक बाहर यह शीर्ष पर्यावरण जब तक करने के लिए प्रदान करती है परिवर्तनीय नाम एक अधिक समीपवर्ती वातावरण में मौजूद है)। क्यों यह बुरा है के उदाहरण यहां हैं:

Examples of the perils of globals in R and Stata

+0

+1। धन्यवाद! – JackeJR

+1

'<< -' को असाइनमेंट के रूप में सोचने के लिए और अधिक समझदारी होती है जो 'x << - value' के बाद संलग्न वातावरण का निरीक्षण करता है' असाइन ('x', मान, विरासत = TRUE) 'के बराबर है। मैं इसे 'असाइन करें' ('x', मान, pos = webobalEnv) से पूरी तरह से अलग उद्देश्यों के लिए उपयोग करता हूं। –

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