R Language
चर का दायरा
खोज…
टिप्पणियों
गुंजाइश के साथ सबसे आम ख़तरा समानांतर में उत्पन्न होता है। सभी चर और कार्यों को एक नए वातावरण में पारित किया जाना चाहिए जो प्रत्येक थ्रेड पर चलाया जाता है।
वातावरण और कार्य
किसी फ़ंक्शन के अंदर घोषित चर केवल उस फ़ंक्शन के अंदर मौजूद (जब तक कि पारित नहीं) होते हैं।
x <- 1
foo <- function(x) {
y <- 3
z <- x + y
return(z)
}
y
त्रुटि: ऑब्जेक्ट 'y' नहीं मिला
चर एक समारोह में पारित कर दिया और फिर से सौंपा गया फिर से लिखा है, लेकिन केवल समारोह के अंदर ।
foo <- function(x) {
x <- 2
y <- 3
z <- x + y
return(z)
}
foo(1)
x
5
1
किसी फ़ंक्शन की तुलना में एक उच्च वातावरण में निर्दिष्ट चर, पारित किए बिना उस फ़ंक्शन के भीतर मौजूद होते हैं।
foo <- function() {
y <- 3
z <- x + y
return(z)
}
foo()
4
उप कार्य
किसी फ़ंक्शन (यानी सबफ़ंक्शन) के भीतर कहे जाने वाले फ़ंक्शंस को उस फ़ंक्शन के भीतर परिभाषित किया जाना चाहिए, जो स्थानीय परिवेश में परिभाषित किए गए किसी भी चर को एक्सेस किए बिना किया जा सके।
यह विफल रहता है:
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <- 3
z <- bar()
return(z)
}
foo()
बार में त्रुटि (): ऑब्जेक्ट 'y' नहीं मिला
यह काम:
foo <- function() {
bar <- function() {
z <- x + y
return(z)
}
y <- 3
z <- bar()
return(z)
}
foo()
4
वैश्विक असाइनमेंट
चर का उपयोग किसी भी वातावरण से विश्व स्तर पर सौंपा जा सकता है <<-
। bar()
अब y
उपयोग कर सकता है।
bar <- function() {
z <- x + y
return(z)
}
foo <- function() {
y <<- 3
z <- bar()
return(z)
}
foo()
4
वैश्विक असाइनमेंट अत्यधिक हतोत्साहित किया जाता है। एक आवरण समारोह का उपयोग करना या किसी अन्य स्थानीय वातावरण से स्पष्ट रूप से कॉल करने वाले चर का उपयोग करना बहुत पसंद किया जाता है।
पर्यावरण और चर के स्पष्ट असाइनमेंट
R में वातावरण को स्पष्ट रूप से कॉल और नाम दिया जा सकता है। चर को स्पष्ट रूप से सौंपा जा सकता है और उन वातावरणों से या उन पर कॉल किया जा सकता है।
आमतौर पर बनाया गया वातावरण वह होता है जो package:base
संलग्न करता package:base
या package:base
भीतर एक सबइनवायरमेंट package:base
।
e1 <- new.env(parent = baseenv())
e2 <- new.env(parent = e1)
चर को स्पष्ट रूप से सौंपा जा सकता है और उन वातावरणों से या उन पर कॉल किया जा सकता है।
assign("a", 3, envir = e1)
get("a", envir = e1)
get("a", envir = e2)
3
3
चूंकि e2
को e1
से विरासत में मिला e1
, e1
और e2
दोनों में a
3
है। हालांकि, बताए a
के भीतर e2
के मूल्य में परिवर्तन नहीं करता है a
में e1
।
assign("a", 2, envir = e2)
get("a", envir = e2)
get("a", envir = e1)
3
2
समारोह से बाहर निकलें
on.exit()
फ़ंक्शन वैरिएबल क्लीन अप के लिए आसान है यदि वैश्विक चर असाइन किए जाने चाहिए।
कुछ पैरामीटर, विशेष रूप से ग्राफिक्स के लिए, केवल विश्व स्तर पर सेट किए जा सकते हैं। अधिक विशिष्ट प्लॉट बनाते समय यह छोटा कार्य आम है।
new_plot <- function(...) {
old_pars <- par(mar = c(5,4,4,2) + .1, mfrow = c(1,1))
on.exit(par(old_pars))
plot(...)
}
पैकेज और मास्किंग
विभिन्न पैकेजों में कार्य और वस्तुओं का एक ही नाम हो सकता है। बाद में लोड किया गया पैकेज पहले पैकेज को 'मास्क' करेगा और एक चेतावनी संदेश मुद्रित किया जाएगा। फ़ंक्शन को नाम से बुलाते समय, सबसे हाल ही में लोड किए गए पैकेज से फ़ंक्शन चलाया जाएगा। पहले के फ़ंक्शन को स्पष्ट रूप से एक्सेस किया जा सकता है।
library(plyr)
library(dplyr)
कोचिंग पैकेज: 'dplyr'
निम्नलिखित वस्तुओं को 'पैकेज: प्लाई' से मास्क किया जाता है:
अरेंज, काउंट, डेसक, फेल्विथ, आईडी, म्यूट, नाम, संक्षेप, संक्षेप
निम्नलिखित वस्तुओं को 'पैकेज: आँकड़े' से नकाबपोश किया जाता है:
फ़िल्टर, अंतराल
निम्नलिखित वस्तुओं को 'पैकेज: बेस' से मास्क किया जाता है:
इंटरसेक्ट, सेटिफ़, सेटिस्सल, यूनियन
कोड लिखते समय, विशेष रूप से package::function()
विशेष रूप से इस समस्या से बचने के लिए फ़ंक्शन को कॉल करने के लिए हमेशा सबसे अच्छा अभ्यास होता है।