2012-03-16 44 views
5

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

एक नकली डेटा सेट और <<-

#CREATE A FAKE DATA SET 
df <- data.frame(
    x.2=rnorm(25), 
    y.2=rnorm(25), 
    g=rep(factor(LETTERS[1:5]), 5) 
) 
#Use split to make a list of data frames 
LIST <- split(df, df$g) #split it into a list of data frames 
NAMES <- names(LIST) #save the names of this for later use 
LIST <- lapply(seq_along(LIST), function(x) as.data.frame(LIST[[x]])[, 1:2]) 

#THE TWO PIECES OF CODE THAT USE <<- 
#Use Global Assignment to Change All Variable Names of Data Frames in a List 
lapply(seq_along(LIST), function(x) names(LIST[[x]]) <<- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
    ".", fixed=T))[c(T, F)] 
) 
LIST 

#Rename All the Data Frames in the List Using Global Assignment 
lapply(seq_along(LIST), function(x) names(LIST)[[x]] <<- NAMES[x]) 
LIST 

के साथ दो कोड असाइनमेंट का उपयोग करने के मेरे प्रयास:

lapply(seq_along(LIST), function(x) { 
    assign(names(LIST[[x]]), 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
    ".", fixed=T))[c(T, F)], envir=.GlobalEnv) 
    } 
) 
LIST 

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

कृपया मुझे सही तरीके से ऐसा करने में मदद करें और मेरे दृष्टिकोण के साथ गलत क्या है। पहले ही, आपका बहुत धन्यवाद।

+1

वस्तुओं के नाम पर्यावरण में 'नाम' नहीं हैं, इसलिए आप यहां 'असाइन' का उपयोग नहीं कर सकते हैं। – kohske

+0

@ कोहस्के धन्यवाद। क्या आप इसे उत्तर के लिए दे सकते हैं और मैं इसे स्वीकार करूंगा? –

उत्तर

2

मुझे लगता है कि यह एक ही बात

LIST <- lapply(seq_along(LIST), function(x) { 
    names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
        ".", fixed=T))[c(T, F)] 
    LIST[[x]] 
}) 
LIST 

names(LIST) <- NAMES 
LIST 

है या, आवंटित

assign("LIST", lapply(seq_along(LIST), function(x) { 
    names(LIST[[x]]) <- 
    unlist(strsplit(names(LIST[[x]])[1:length(names(LIST[[x]]))], 
        ".", fixed=T))[c(T, F)] 
    LIST[[x]] 
}), pos=.GlobalEnv) 
+0

मुझे यह पसंद है कि मुझे 'असाइन' या' << - 'का उपयोग करने की आवश्यकता नहीं है। –

3

मुझे समझ नहीं आता क्यों आप इस कार्य को बहुत जटिल बना दिया उपयोग करने के लिए। यह सिर्फ नहीं है:

LIST <- df[, 1:2] 
names(LIST) <- sapply(strsplit(names(LIST), '.', fixed = TRUE), `[`, 1) 
LIST <- split(LIST, df$g) 

यानी आप df के पहले 2 कॉलम चाहते हैं; आप . से पहले नाम चाहते हैं, और आप डेटा फ्रेम विभाजित करते हैं। अपने कार्यों को पुनर्गठित करें और आपको समस्या का एक बहुत स्पष्ट दृष्टिकोण होगा।

बीटीडब्ल्यू, <<- आवश्यक रूप से एक भयानक जानवर नहीं है; आप शीर्ष पर्यावरण में परिवर्तनीय नाम बनाकर इसे बहुत सुरक्षित रूप से उपयोग कर सकते हैं, उदा। अगर आप किसी भी स्थानों में सब पर चर नाम नहीं बनाते

x <- 0 
f <- function() x <<- 1 

खतरा केवल मौजूद है, तो आर वैश्विक वातावरण पर निर्भर सभी तरह से जाना है, और कहा कि आम तौर पर एक बहुत बुरा व्यवहार है।

+0

कृपया पुनरुत्पादित डेटा को अनदेखा करें। यह सिर्फ मेरे कार्यों में उत्पन्न समस्या को स्थापित करने के लिए था। आप समाधान केवल तभी काम करते हैं जब डेटा डेटा फ्रेम से सरल और बनाया गया था और 'स्प्लिट' जो यह नहीं है। जीएसई ने बहुत अच्छी तरह से समस्या का उत्तर दिया। वैश्विक असाइनमेंट पर जानकारी के लिए +1। –

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