2013-04-23 9 views
6

昨日私はRをバージョン3.0.0に、ggplot2をバージョン0.9.3.1にアップグレードしました(私のスクリプトに少し変更を加えました)。私はプロットを保存しようとするとエラーが発生します。残念ながら、エラーは小さなデータフレームでは再現されないため、同じサイズのコードを生成するコードを追加しました。 UseMethod(「深さ」)でループ内でRにプロットを保存する

エラー:

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

は、このスクリプトを実行するには、私は、次のエラーメッセージを表示しない該当メソッドをクラス「NULLのオブジェクトに適用される「深さ」 ため"

ただし、スクリプトを1行ずつ実行すると、すべてが正常に実行されます(下の図を参照)。私は、forループを変更すると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場合How the ggplot should lookは今、私は

を示すエラーメッセージが表示さ
A sharing violation occurred while accessing <filename> 

RStudioバージョン0.97.449を使用してスクリプトを実行します。 現在のプロットを保存するために変更する必要があるアイデアはありますか?

+0

各ループ内で、デバイス(例: 'png()')、あなたのプロットの前に一意のファイル名を与えます。次に、ループの終わりにデバイスを 'dev.off()'で閉じます。 –

答えて

12

ポイントdev.copy

利用graphics.off()のカップル。これにより、すべてのグラフィックデバイスが閉じます。また、二回dev.off()を呼び出すことができます(ただし、graphics.off()は基本的にすべてのグラフィックスデバイス

ggsaveprint編オブジェクトを必要としない(これはない

FAQ 7.22が関連している場合)を閉鎖する dev.off()十分な時間を呼び出しますラッパーです。

デフォルトは、最後に作成ggplotオブジェクトですlast_plotの値は、修正または印刷されている。だから、pを作成すると、そのオブジェクトを保存する ggsave('filname.png')のために十分である。

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) 
    } 
} 
関連する問題