2013-04-23 32 views
6

Gestern habe ich R auf Version 3.0.0 und ggplot2 auf Version 0.9.3.1 aktualisiert (und ein paar kleinere Änderungen an meinem Skript vorgenommen). Jetzt bekomme ich Fehler beim Versuch, Diagramme zu speichern - leider wird der Fehler nicht mit einem kleineren Datenrahmen reproduziert, also habe ich Code eingefügt, um einen der gleichen Größe zu generieren.Plots in R innerhalb einer Schleife speichern

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) 
    } 
} 

Auf dieses Skript ausgeführt wird, erhalte ich folgende Fehlermeldung:

Fehler in UseMethod („Tiefen“): keine anwendbare Methode für ‚Tiefen‘ auf ein Objekt der Klasse „NULL angewandt "

Allerdings, wenn ich das Skript Zeile für Zeile ausführen, läuft alles in Ordnung (Bild unten). How the ggplot should look Nun, wenn ich die for-Schleife und verwenden dev.copy und ggsave statt dev.print wie unten

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") 
    } 
} 

Bei dem Versuch zu öffnen „MyGGPlot.png“ mit Paint ändern, erhalte ich eine Fehlermeldung, die besagt

A sharing violation occurred while accessing <filename> 

Ich führe das Skript mit RStudio Version 0.97.449. Irgendwelche Ideen, was ich ändern muss, um aktuelle Plots zu speichern?

+0

Versuchen Sie innerhalb einer Schleife, ein Gerät zu öffnen (z. 'png()'), und geben Sie vor dem Plot einen eindeutigen Dateinamen an. Schließen Sie das Gerät am Ende der Schleife mit 'dev.off()'. –

Antwort

12

Ein paar Punkte

Verwenden graphics.off() nach dev.copy. Dies schließt alle Grafikgeräte. Sie könnten auch dev.off() zweimal nennen (aber graphics.off() ist ein Wrapper, der im Grunde dev.off() ausreichend Zeiten erfordern alle Grafikgeräte

ggsave nicht erfordert ein print ed Objekt (das ist nicht ein Fall, in dem FAQ 7.22 ist relevant) zu schließen .

der Standardwert ist der Wert von last_plot die die letzte ggplot Objekt erzeugt, modifiziert oder gedruckt wird p ausreichende Schaffung So ggsave('filname.png') ist. für das Objekt zu speichern, um.

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) 
    } 
} 
Verwandte Themen