2012-03-15 17 views
13

एक दिन पहले यहां एक पोस्ट में मुझे आश्चर्य है कि एक समारोह के भीतर से वैश्विक वातावरण में कई ऑब्जेक्ट्स को मूल्य कैसे असाइन करना है। यह मेरा प्रयास है lapply (assign<<- से अधिक सुरक्षित हो सकता है लेकिन मैंने वास्तव में इसका उपयोग कभी नहीं किया है और इससे परिचित नहीं हूं)।फ़ंक्शन के भीतर से WebobalEnv को एकाधिक ऑब्जेक्ट असाइन करें

#fake data set 
df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 

#split it into a list of data frames 
LIST <- split(df, df$g) 

#pre-allot 5 objects in R with class data.frame() 
V <- W <- X <- Y <- Z <- data.frame() 

#attempt to assign the data frames in the LIST to the objects just created 
lapply(seq_along(LIST), function(x) c(V, W, X, Y, Z)[x] <<- LIST[[x]]) 

कृपया इस काम को करने के लिए मेरे कोड के किसी भी/सभी हिस्सों को छोटा करने के लिए स्वतंत्र महसूस करें (या बेहतर/तेज काम करें)।

+3

यह सवाल या इसका कोई जवाब एक बड़े "बच्चों के साथ आना चाहिए, घर पर ऐसा मत करो!" अस्वीकरण। जैसा कि आप जानते हैं, रिचर्ड बर्न्स (http://www.burns-stat.com/pages/Tutor/R_inferno.pdf) – flodel

+0

@flodel उद्धृत करने के लिए कार्यों के भीतर वैश्विक असाइनमेंट आपदा के लिए एक नुस्खा है, या "ज्वालामुखी द्वारा जीवन" मैं कोई प्रोग्रामर नहीं हूं, तो क्या आप संक्षेप में बता सकते हैं कि कार्य करने का मुद्दा क्या है? –

+0

तो मैंने आपके द्वारा उद्धृत अनुभाग को पढ़ा। यह सार्वजनिक उपभोग के लिए कोड के लिए बुद्धिमान लगता है लेकिन व्यक्तिगत कोड के लिए नहीं। क्या आप इसे प्रभावित करने के लिए एक तरीका देख सकते हैं? –

उत्तर

22

आप सही हैं कि assign() नौकरी के लिए सही उपकरण है। इसका envir तर्क आपको असाइनमेंट देता है जहां असाइनमेंट होता है - नियंत्रण जो <- या <<- के साथ उपलब्ध नहीं है।

तो, उदाहरण के लिए, वैश्विक वातावरण में NAME नामित एक वस्तु को X का मान देना, आप क्या करेंगे:

assign("NAME", X, envir = .GlobalEnv) 

आपके मामले में:

df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 
LIST <- split(df, df$g) 
NAMES <- c("V", "W", "X", "Y", "Z") 

lapply(seq_along(LIST), 
     function(x) { 
      assign(NAMES[x], LIST[[x]], envir=.GlobalEnv) 
     } 
) 

ls() 
[1] "df" "LIST" "NAMES" "V"  "W"  "X"  "Y"  "Z"  
+0

धन्यवाद। मुझे पता था '<< -' खराब रूप है लेकिन आलसी रहा है। मैं 'असाइन' का उपयोग करने की आदत में जाऊंगा। वास्तव में आप वास्तव में एक बिंदु पर क्या करते थे लेकिन सोचा था कि मुझे ऑब्जेक्ट्स के चारों ओर उद्धरण चिह्न नहीं डालना चाहिए क्योंकि मैंने पहले ही उन्हें आवंटित किया था। यह किसी भी तरह से आसान है। –

+0

हाँ। 'असाइन()' का उपयोग करना उन चीजों में से एक है जो इसे करने से पहले खत्म होने के लिए एक कूल्हे की तरह दिखते हैं, लेकिन एक बार ऐसा करने के बाद, आपको आश्चर्य होता है कि आपको पहले स्थान पर कभी भी कोई हिचकिचाहट क्यों हुई। –

+0

+1 - सोना। मुझे पर्यावरण में सभी वस्तुओं को वैश्विक पर्यावरण में अभी असाइन करना पड़ा, और इस समाधान ने मुझे इसे सोचने के लिए बचाया। – ricardo

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