आर

2015-08-13 2 views
10

में लूप के भीतर से सूची में ggplot ऑब्जेक्ट्स को संग्रहीत करना मेरी समस्या this one के समान है; जब मैं एक लूप में प्लॉट ऑब्जेक्ट्स (इस मामले में हिस्टोग्राम) उत्पन्न करता हूं, ऐसा लगता है कि वे सभी हालिया साजिश द्वारा अधिलेखित हो जाते हैं।आर

लूप के भीतर, डीबग करने के लिए, मैं इंडेक्स और जेनरेटेड प्लॉट प्रिंट कर रहा हूं, जिनमें से दोनों सही ढंग से दिखाई देते हैं। लेकिन जब मैं सूची में संग्रहीत भूखंडों को देखता हूं, तो वे लेबल के लिए को छोड़कर सभी समान होते हैं।

(मैं multiplot उपयोग कर रहा हूँ एक समग्र छवि बनाने के लिए, लेकिन आप एक ही परिणाम आप print (myplots[[1]]) print(myplots[[4]]) एक समय में एक के माध्यम से करता है, तो मिलता है।)

क्योंकि मैं पहले से ही एक संलग्न dataframe (के पोस्टर के विपरीत है इसी तरह की समस्या), मुझे यकीन नहीं है कि समस्या को कैसे हल किया जाए।

(Btw, स्तंभ वर्गों मूल डाटासेट मैं यहाँ का अनुमान कर रहा हूँ में कारक हैं, लेकिन एक ही समस्या होती है यदि वे पूर्णांक हैं)

यहाँ एक प्रतिलिपि प्रस्तुत करने योग्य उदाहरण है:

library(ggplot2) 
source("http://peterhaschke.com/Code/multiplot.R") #load multiplot function 

#make sample data 
col1 <- c(2, 4, 1, 2, 5, 1, 2, 0, 1, 4, 4, 3, 5, 2, 4, 3, 3, 6, 5, 3, 6, 4, 3, 4, 4, 3, 4, 
      2, 4, 3, 3, 5, 3, 5, 5, 0, 0, 3, 3, 6, 5, 4, 4, 1, 3, 3, 2, 0, 5, 3, 6, 6, 2, 3, 
      3, 1, 5, 3, 4, 6) 
col2 <- c(2, 4, 4, 0, 4, 4, 4, 4, 1, 4, 4, 3, 5, 0, 4, 5, 3, 6, 5, 3, 6, 4, 4, 2, 4, 4, 4, 
      1, 1, 2, 2, 3, 3, 5, 0, 3, 4, 2, 4, 5, 5, 4, 4, 2, 3, 5, 2, 6, 5, 2, 4, 6, 3, 3, 
      3, 1, 4, 3, 5, 4) 
col3 <- c(2, 5, 4, 1, 4, 2, 3, 0, 1, 3, 4, 2, 5, 1, 4, 3, 4, 6, 3, 4, 6, 4, 1, 3, 5, 4, 3, 
      2, 1, 3, 2, 2, 2, 4, 0, 1, 4, 4, 3, 5, 3, 2, 5, 2, 3, 3, 4, 2, 4, 2, 4, 5, 1, 3, 
      3, 3, 4, 3, 5, 4) 
col4 <- c(2, 5, 2, 1, 4, 1, 3, 4, 1, 3, 5, 2, 4, 3, 5, 3, 4, 6, 3, 4, 6, 4, 3, 2, 5, 5, 4, 
      2, 3, 2, 2, 3, 3, 4, 0, 1, 4, 3, 3, 5, 4, 4, 4, 3, 3, 5, 4, 3, 5, 3, 6, 6, 4, 2, 
      3, 3, 4, 4, 4, 6) 
data2 <- data.frame(col1,col2,col3,col4) 
data2[,1:4] <- lapply(data2[,1:4], as.factor) 
colnames(data2)<- c("A","B","C", "D") 

#generate plots 
myplots <- list() # new empty list 
for (i in 1:4) { 
    p1 <- ggplot(data=data.frame(data2),aes(x=data2[ ,i]))+ 
    geom_histogram(fill="lightgreen") + 
    xlab(colnames(data2)[ i]) 
    print(i) 
    print(p1) 
    myplots[[i]] <- p1 # add each plot into plot list 
} 
multiplot(plotlist = myplots, cols = 4) 

जब मैं देखो भूखंड की सूची में एक भूखंड वस्तु का एक सारांश है, यह मैं क्या देख

> summary(myplots[[1]]) 
data: A, B, C, D [60x4] 
mapping: x = data2[, i] 
faceting: facet_null() 
----------------------------------- 
geom_histogram: fill = lightgreen 
stat_bin: 
position_stack: (width = NULL, height = NULL) 

मुझे लगता है कि mapping: x = data2[, i] समस्या है, लेकिन मैं स्टम्प्ड रहा हूँ! मैं छवियों को पोस्ट नहीं कर सकता, इसलिए यदि आप समस्या का मेरी व्याख्या भ्रमित कर रहे हैं तो आपको अपना उदाहरण चलाने और ग्राफ को देखने की आवश्यकता होगी।

धन्यवाद!

उत्तर

22

अन्य उत्कृष्ट जवाब देने के लिए इसके अलावा, यहां एक समाधान "सामान्य" दिखने मूल्यांकन बल्कि eval से उपयोग करता है है। चूंकि for लूपों के पास कोई अलग वैरिएबल स्कोप नहीं है (यानी वे वर्तमान वातावरण में प्रदर्शन कर रहे हैं) for ब्लॉक को लपेटने के लिए हमें local का उपयोग करने की आवश्यकता है; पूरी तरह for पाश त्याग और सूची कार्यों का उपयोग का निर्माण करने के लिए

myplots <- list() # new empty list 
for (i in 1:4) 
    local({ 
     i <- i 
     p1 <- ggplot(data=data.frame(data2),aes(x=data2[ ,i]))+ 
      geom_histogram(fill="lightgreen") + 
      xlab(colnames(data2)[ i]) 
     print(i) 
     print(p1) 
     myplots[[i]] <<- p1 # add each plot into plot list 
    }) 

हालांकि, एक पूरी तरह क्लीनर तरीका है: जो हम बस इसे फिर से बताए द्वारा कर सकते हैं - इसके अलावा, हम i एक स्थानीय चर बनाने की जरूरत है परिणाम। यह कई संभावित तरीकों से काम करता है। निम्नलिखित मेरी राय में सबसे आसान है:

plot_data_column = function (data, column) 
    ggplot(data = data2, aes_string(x = column)) + 
     geom_histogram(fill = "lightgreen") + 
     xlab(column) 

myplots <- lapply(colnames(data2), plot_data_column, data = data2) 

यह कई लाभ हैं: यह आसान है और यह (पाश चर i के साथ) पर्यावरण को अव्यवस्थित नहीं करेंगे।

+0

फ़ंक्शन – jenesaisquoi

+0

के साथ अच्छा विचार, विशेष रूप से लापरवाही संस्करण के लिए, आपको बहुत धन्यवाद; मैं इसे कार्यान्वित करना चाहता था लेकिन इसे समझ नहीं पाया, और लूप के लिए (सतही रूप से आसान, वास्तव में भयानक) करने का फैसला किया। मुझे लगा कि यह एक परिवर्तनीय गुंजाइश समस्या थी, मैं अक्सर उन्हें आर में लड़ रहा हूँ! – LizPS

2

लूप के अंत में मूल्यांकन किए गए अभिव्यक्तियों के सभी उद्धरणों के कारण, i जो लूप के अंत में मूल्यांकन किया जाता है, उस समय होता है जो i उस समय होता है, जो इसका अंतिम मूल्य है। आप प्रत्येक पुनरावृत्ति के दौरान सही मूल्य में eval(substitute( आईएनजी द्वारा इसे प्राप्त कर सकते हैं।

myplots <- list() # new empty list 
for (i in 1:4) { 
    p1 <- eval(substitute(
     ggplot(data=data.frame(data2),aes(x=data2[ ,i]))+ 
      geom_histogram(fill="lightgreen") + 
      xlab(colnames(data2)[ i]) 
    ,list(i = i))) 
    print(i) 
    print(p1) 
    myplots[[i]] <- p1 # add each plot into plot list 
} 
multiplot(plotlist = myplots, cols = 4) 
+0

निदान सही है लेकिन समाधान कुछ हद तक शांत है। स्थानीय संदर्भ में 'i' को कैप्चर करना आसान है। समस्या यह है कि आर में 'लूप' के लिए कोई गुंजाइश नहीं है, इसलिए आपको इसके बजाय 'स्थानीय' का उपयोग करने की आवश्यकता है: '(मैं 1: 4 में) स्थानीय ({i = i; ... बाकी लूप ...}) '। आत्म-असाइनमेंट 'i = i' दुर्घटना से नहीं है - यह वास्तव में आवश्यक है। एक अलग चर नाम भी इस्तेमाल किया जा सकता है।भले ही, यह 'for'' के बजाय "उचित" सूची फ़ंक्शंस का उपयोग करके अनावश्यक होगा, जो आर –

+0

@ कोनराड रुडॉल्फ 'स्थानीय' में खराब भाषा का निर्माण अच्छा है – jenesaisquoi

+0

आह, मैं कुछ भूल गया: यदि' स्थानीय' है प्रयुक्त, 'myplots [[i]] को असाइनमेंट को स्थानीय असाइनमेंट के बजाय '<< -' ऑपरेटर का उपयोग करने की आवश्यकता है। –