2015-05-22 2 views
8

से नहीं मिला मैं साइटों है कि मैं के लिए ggplots उत्पादन, changepoint पैकेज का उपयोग साधन में परिवर्तन दिखाने का एक नंबर के लिए समय श्रृंखला डेटा की एक csv है। मैंने एक ऐसा फ़ंक्शन लिखा है जो सीएसवी लेता है, साधनों को प्राप्त करने के लिए कुछ गणना करता है, फिर प्रत्येक के लिए एक साजिश उत्पन्न करने वाली साइटों के माध्यम से लूप करता है। मेरी समस्या यह है कि लूप में बनाई गई वस्तु नहीं मिली है।वस्तु समारोह के अंदर बनाया ggplot

एक बहुत ही सरल उदाहरण नीचे है, लेकिन एक ही त्रुटि पैदा करता है:

df1 <- data.frame(date = seq(as.Date("2015-01-01"), as.Date("2015-01-10"), 
         by = "day"), 
       site1 = runif(10), 
       site2 = runif(10), 
       site3 = runif(10)) 

example <- function(df1){ 

    sname <- names(df1)[-1] 

    for (i in 1:length(sname)){ 
      df2 <- df1[,c(1, 1+i)] 
      df2$label <- factor(rep("ts", by=length(df2[,1]))) 

      plot <- ggplot()+ 
        geom_point(data=df2, aes(x=date, y=df2[,2]))+ 
        geom_line(data=df2, aes(x=date, y=df2[,2])) 
      sname.i<-sname[i] 
      filename<-paste0(sname.i, "-test-plot.pdf") 
      ggsave(file=filename, plot) 
    } 
} 

example(df1) 

त्रुटि मैं मिलता है: "eval त्रुटि (expr, माहौल, enclos): ऑब्जेक्ट 'df2' नहीं मिला"

मुझे पूरा यकीन नहीं है कि समस्या क्या है क्योंकि मैंने अतीत में काम करने वाले समान लूप बनाए हैं। यदि मैं लूप के भीतर कोड के माध्यम से एक मूल्य आवंटित करता हूं और यह ठीक काम करता है। मैं पर्यावरण की समस्या सोच रहा हूँ? या ggsave कुछ wiggy कर रहा है? किसी भी मदद/पॉइंटर्स आभारी रूप से प्राप्त किया। धन्यवाद।

+0

जब मैं अपने कोड चलाने के लिए, समस्या 'sname' है। इस चर के बिना परिभाषित किया जा रहा है, 'मैं भी अनिश्चित रहता है, और फिर भी' df2' होता है। – vaettchen

+0

@vaettchen। क्या आपने पूरा फ़ंक्शन या लूप चलाया था?मैंने अपने घर के कंप्यूटर पर उदाहरण समारोह फिर से चलाया और अभी भी ऊपर बताए गए त्रुटि को प्राप्त किया है। यह मेरे लिए df2 पर विफल रहता है। – Bart

+0

समस्या को सही ढंग से निर्दिष्ट करने के लिए प्रश्न शीर्षक संपादित किया गया। –

उत्तर

4

आप समस्या को इतना अपने कोड, लेकिन ggplot2 पैकेज के कार्यान्वयन नहीं है। यह पैकेज गैर-मानक मूल्यांकन का उपयोग करता है, और यह आपके परिणामों को गंभीरता से गड़बड़ कर सकता है।

इस पोस्ट के अंत में उदाहरण कोड देखें। मैं वैश्विक वातावरण में विभिन्न मानों के साथ df2 नामक डेटा फ्रेम बना देता हूं। अगर मैं अब अपने कोड चलाने के लिए, आप भूखंडों कि इस तरह दिखता है मिलती है:

enter image description here

ध्यान दें कि एक्स अक्ष पर, यह सही दिनांक का उपयोग करता है, लेकिन Y अक्ष पर मान dataframe से होते हैं df2 जो वैश्विक पर्यावरण में है! तो फ़ंक्शन aes() डेटा को दो अलग-अलग स्थानों में देखता है। यदि आप एक चर के नाम को प्रतीक के रूप में निर्दिष्ट करते हैं (date) फ़ंक्शन पहले फ़ंक्शन कॉल में निर्दिष्ट डेटा फ्रेम में दिखता है। हालांकि, df2[,2] जैसी अभिव्यक्ति डेटाफ्रेम में नहीं मिल सकती है, क्योंकि उस नाम के साथ कोई चर नहीं है। जिस तरह से ggplot2 पैकेज बनाया गया है, आर कॉलिंग पर्यावरण की बजाय वैश्विक पर्यावरण में इसकी तलाश करेगा।

प्रति Wici की टिप्पणी के रूप में: आपका सबसे अच्छा विकल्प शायद, समारोह aes_string() उपयोग करने के लिए के रूप में इस आप चरित्र के रूप में एईएस पारित करने के लिए अनुमति देता है, और इस समारोह सही वातावरण में भाव का मूल्यांकन करता है:

plot <- ggplot()+ 
     geom_point(data=df2, aes_string(x="date", y=sname[i]))+ 
     geom_line(data=df2, aes_string(x="date", y=sname[i])) 

वैकल्पिक रूप से, आप eval() और इस तरह parse() का उपयोग करके कुछ मिल सकता है:

example <- function(df1){ 

    sname <- names(df1)[-1] 

    for (i in 1:length(sname)){ 
    df2 <- df1[,c(1, 1+i)] 
    df2$label <- factor(rep("ts", by=length(df2[,1]))) 

    aesy <- sname[i] 
    command <- paste("plot <- ggplot()+ 
     geom_point(data=df2, aes(x=date, y=",aesy,"))+ 
     geom_line(data=df2, aes(x=date, y=",aesy,"))") 

    eval(parse(text=command))      
    sname.i<-sname[i] 
    print(plot) 
    } 

आप उदाहरण स्क्रिप्ट के साथ बाहर है कि कोशिश करते हैं नीचे, आप देखेंगे कि इस बार आपके आस-पास सही मान प्रदर्शित होते हैं। ध्यान दें कि यह एक उप-समाधान समाधान है, क्योंकि eval() से अधिकतर समाधान शामिल हैं। मैं यहाँ aes_string() के लिए जाना होगा।


उदाहरण स्क्रिप्ट

df1 <- data.frame(date = seq(as.Date("2015-01-01"), as.Date("2015-01-10"), 
          by = "day"), 
        site1 = runif(10), 
        site2 = runif(10), 
        site3 = runif(10)) 

df2 <- data.frame(date = seq(as.Date("2014-10-01"), as.Date("2014-10-10"), 
          by = "day"), 
        site1 = runif(10,10,20), 
        site2 = runif(10,10,20), 
        site3 = runif(10,10,20)) 

example <- function(df1){ 

    sname <- names(df1)[-1] 

    for (i in 1:length(sname)){ 
    df2 <- df1[,c(1, 1+i)] 
    df2$label <- factor(rep("ts", by=length(df2[,1]))) 

    plot <- ggplot()+ 
     geom_point(data=df2, aes(x=date, y=df2[,2]))+ 
     geom_line(data=df2, aes(x=date, y=df2[,2])) 

    sname.i<-sname[i] 
    print(plot) 
    } 
} 

example(df1) 
+2

आप बिल्कुल सही हैं, लेकिन ggplot2 सौंदर्यशास्त्र के नियमित मूल्यांकन के लिए एक समारोह भी प्रदान करता है। बस अपने सौंदर्य जनरेटर के रूप में 'aes_string (x =" date ", y = aesy) का उपयोग करें। – wici

+0

@ जोरीस। उसके लिए धन्यवाद। जीजीप्लॉट में बेस ग्राफिक्स में जो मैंने उपयोग किया है उसे बदलने के मेरे प्रयासों में मैं देख सकता हूं कि मैं कहां गलत हो रहा हूं। – Bart

+0

@wici। पारितोषिक के लिए धन्यवाद। – Bart

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