2012-05-25 8 views
8

मैं अक्सर वैश्विक वातावरण के तहत एक वातावरण में कई चर बनाना चाहते हैं का काम के लिए डिफ़ॉल्ट माहौल बदल रहा। यह envirsys.source पर तर्क के साथ आसानी से किया जा सकता है - यदि किसी सोर्सिंग वाली फ़ाइल द्वारा बनाई गई सभी चर को एक ही वातावरण में जाना है।नया चर

लेकिन मैं आम तौर पर एक फ़ाइल है कि चर का सेट बनाता है के साथ काम करते हैं। एक सेट को एक पर्यावरण में जाना चाहिए, एक और सेट दूसरे वातावरण में जाना चाहिए, और इसी तरह। मैं इस फाइल को कई फाइलों में विभाजित नहीं करना चाहता हूं और फिर sys.source पर कई कॉल कराना चाहता हूं।

इसके बजाय, मैं एक कमांड मुझे नए चर के काम के लिए डिफ़ॉल्ट वातावरण बदल देता है कि चाहते हैं। उदाहरण के लिए:

e <- new.env() 
setDefaultEnvironment(e) 
tmp <- 2 
e$tmp   # 2 
.GlobalEnv$tmp # Error: object 'tmp' not found 

लेकिन setDefaultEnvironment कोई वास्तविक आदेश नहीं है।

वहाँ आर में बात की इस तरह करने के लिए कोई सुरक्षित रास्ता नहीं है?

+2

क्या आप यह विवरण दे सकते हैं कि आप यह – Dason

+0

@Dason - हाँ क्यों करना चाहते हैं, मैंने मूल पोस्ट को कुछ और विवरण के साथ अपडेट किया है। – user697473

उत्तर

4

evalq फ़ंक्शन एक निर्दिष्ट वातावरण में अपने पहले तर्क का मूल्यांकन करेगा, ताकि आप अपना नया वातावरण बना सकें, फिर असाइनमेंट को evalq में लपेटें।

8

संभवतः किसी ने इस पर सुधार कर सकते हैं, चर नाम उद्धृत करने की आवश्यकता नहीं पड़ती:

e <- new.env() 
`%=%` <- function(x,y) {assign(x,y,envir = e)} 

"d" %=% 5 

e$d 
[1] 5 

लेकिन यह मेरे लिए एक तरह से मूर्खतापूर्ण लगता है। शायद सीधे assign का उपयोग करें? अधिक टाइपिंग, हो सकता है, लेकिन यह वही करता है जो आप कम खतरे के साथ चाहते हैं।

+7

'"% =% "<- फ़ंक्शन (x, y) {असाइन करें (as.character (विकल्प (x)), y, envir = e)} 'आपको केवल' d% =% 5' करने की अनुमति देनी चाहिए डी के आसपास उद्धरण के बिना। – Dason

+0

आप अस्थायी रूप से '=' (और/या '<-') ओवरराइड भी कर सकते हैं। सावधान रहें, यह सभी प्रकार की चीजें तोड़ देगा। ;-) –

10

यह स्पष्ट होना करने के लिए सबसे अच्छा है: बदलते वैश्विक राज्यों खतरनाक है। इस प्रकार:

e <- new.env() 
with(e, {foo <- bar; foo2 <- bar2}) 

थोड़ा झगड़ा के साथ, साफ-सुथरा काम करेगा, जबकि मुख्य रूप से पर्यावरण को प्रदर्शित करता है।

0

इसके बजाय माहौल बदल रहा, एक आसान तरीका यह करने के लिए एक सूची में सभी चर को बचाने के लिए है।

e <- list() 
e$tmp <- 2 
संबंधित मुद्दे