2013-04-23 8 views
6

कल मैंने आर को संस्करण 3.0.0 और ggplot2 को संस्करण 0.9.3.1 में अपग्रेड किया (और मेरी स्क्रिप्ट में कुछ मामूली परिवर्तन किए)। अब मुझे भूखंडों को बचाने का प्रयास करते समय त्रुटियां मिल रही हैं - दुर्भाग्यवश त्रुटि को छोटे डेटाफ्रेम के साथ पुन: उत्पन्न नहीं किया गया है, इसलिए मैंने एक ही आकार में से एक उत्पन्न करने के लिए कोड शामिल किया है। 'गहराई' वर्ग "शून्य का एक उद्देश्य के लिए लागू करने के लिए कोई लागू विधि: UseMethod (" गहराई ") मेंआर में लूप को सहेजना

त्रुटि:

library("ggplot2") 

# Create data frame 
# Time interval ID (x) 
bin.ts.avg <- as.data.frame(rep(1:18, 31)) 
names(bin.ts.avg) <- "x" 
# Time (sequence of 10 minuter intervals between 7am and 10am) 
tt.month.bins <- seq(from=as.POSIXct("2012-01-01 GMT"), to=as.POSIXct("2012-01-01 GMT") + 60*60*24*31, by="10 mins") 
tt.month.bins <- tt.month.bins[-length(tt.month.bins)] 
temp <- as.numeric(format(tt.month.bins, "%H")) 
ind <- which(temp >=7 & temp <= 9) 
tt.month.bins <- tt.month.bins[ind] 
bin.ts.avg$dep <- tt.month.bins 
# Value (with some NA) 
bin.ts.avg$tt <- runif(558, min=2.5, max=5) 
bin.ts.avg$tt[trunc(runif(200, min=1, max=558))] <- NA 
# Day 
bin.ts.avg$depday <- rep(1:31, each=18) 

for (i in 1:2){ 
    if (1){ 
    hist(rnorm(100)) 
    dev.print(file="MyHist.png",device=png, bg="white", width=640, height=352) 

    p <- ggplot(bin.ts.avg, aes(x, tt)) + geom_point() +geom_line() + facet_grid(.~depday) 
    p <- p + ggtitle("10 minute averages")+ xlab("Hour") + ylab("Values")  
    p <- p + scale_x_continuous(breaks=c(min(bin.ts.avg$x), max(bin.ts.avg$x)), labels=c("7", "10")) 
    print(p) 
    dev.print(file="MyGGPlot.png",device=png, bg="white", width=640, height=352) 
    } 
} 

इस स्क्रिप्ट चलाने पर, मैं निम्नलिखित त्रुटि संदेश मिलता है "

हालांकि, अगर मैं लाइन द्वारा स्क्रिप्ट लाइन चलाता हूं तो सब कुछ ठीक हो जाता है (नीचे चित्र)। How the ggplot should look अब अगर मैं पाश के लिए बदल सकते हैं और dev.copy का उपयोग करें और "MyGGPlot.png" खोलने के लिए पेंट का उपयोग कर प्रयास कर रहा पर

for (i in 1:2){ 
    if (1){ 
    hist(rnorm(100)) 
    dev.copy(file="MyHist.png",device=png, bg="white", width=640, height=352) 
    dev.off() 

    p <- ggplot(bin.ts.avg, aes(x, tt)) + geom_point() +geom_line() + facet_grid(.~depday) 
    p <- p + ggtitle("10 minute averages")+ xlab("Hour") + ylab("Values")  
    p <- p + scale_x_continuous(breaks=c(min(bin.ts.avg$x), max(bin.ts.avg$x)), labels=c("7", "10")) 
    print(p) 
    ggsave(filename="MyGGPlot.png") 
    } 
} 

नीचे के रूप में dev.print के बजाय ggsave, मैं बताते हुए एक त्रुटि संदेश प्राप्त

A sharing violation occurred while accessing <filename> 

मैं RStudio संस्करण 0.97.449 का उपयोग कर स्क्रिप्ट चलाता हूं। वर्तमान भूखंडों को बचाने के लिए मुझे क्या बदलने की जरूरत है इस पर कोई विचार?

+0

प्रत्येक पाश के भीतर, डिवाइस खोलने का प्रयास करें (उदा। 'png()'), और अपनी साजिश से पहले एक अद्वितीय फ़ाइल नाम दें। फिर 'dev.off() 'के साथ लूप के अंत में डिवाइस बंद करें। –

उत्तर

12

dev.copy के बाद अंक

उपयोग graphics.off() के एक जोड़े। यह सभी ग्राफिक्स उपकरणों को बंद कर देगा। तुम भी dev.off() दो बार कह सकते हैं (लेकिन graphics.off() एक आवरण है कि मूल रूप से dev.off() पर्याप्त बार फोन करेगा सभी ग्राफिक्स उपकरणों

ggsave एक print एड वस्तु की आवश्यकता नहीं है (यह नहीं एक मामले में जहां FAQ 7.22 प्रासंगिक है) बंद करने के लिए है ।

डिफ़ॉल्ट ggsave('filname.png') उस वस्तु को बचाने के लिए के लिए last_plot जो पिछले ggplot बनाई गई वस्तु, संशोधित या मुद्रित। तो p बनाने है का मूल्य है पर्याप्त है।

for (i in 1:2){ 
    if (1){ 
    hist(rnorm(100)) 
    dev.copy(file="MyHist.png",device=png, bg="white", width=640, height=352) 
    graphics.off() 

    p <- ggplot(bin.ts.avg, aes(x, tt)) + geom_point() +geom_line() + facet_grid(.~depday) 
    p <- p + ggtitle("10 minute averages")+ xlab("Hour") + ylab("Values")  
    p <- p + scale_x_continuous(breaks=c(min(bin.ts.avg$x), max(bin.ts.avg$x)), labels=c("7", "10")) 
    # no need to print p 
    ggsave(filename="MyGGPlot.png") 
    # note specifying p is redundant but explicit. 
    # ggsave(filename = 'MyGGplot.png', plot = p) 
    } 
} 
संबंधित मुद्दे