30

ggsave を使用していくつかのプロットを保存する R スクリプトがあります。コマンド ラインからスクリプトを実行すると、プロットが保存されるだけでなく、空の Rplots.pdf ファイルも保存されます。R がこの不要なファイルを作成しないようにするにはどうすればよいですか?

エラーを再現するスクリプトの例を次に示します。

#!/usr/bin/env Rscript

# Code that creates unnecessary Rplots.pdf file
library(ggplot2)
my.data <- data.frame(x = 1:10, y = 1:10)
my.plot <- qplot(x, y, data = my.data)
ggsave('example.png', my.plot) 

スクリプトを実行する次のすべての方法で、不要なファイルが作成されます。

Rscript script.R
Rscript --vanilla script.R
chmod a+x script.R
./script.R 

また、対話型セッション内からコードをソースすると、不要な空白の R グラフィックス デバイス ウィンドウが開きます。

さらに、ggsave の代わりに次のより詳細なコードを使用すると、これらの問題は発生しません。

#!/usr/bin/env Rscript

# Code that does NOT create unnecessary Rplots.pdf file
library(ggplot2)
my.data <- data.frame(x = 1:10, y = 1:10)
my.plot <- qplot(x, y, data = my.data)
png(file = 'example.png')
print(my.plot)
dev.off()

これが私のセッション情報です(Rscriptを実行していてもインタラクティブに実行していても同じです):

R version 3.0.1 (2013-05-16)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=C                 LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] methods   stats     graphics  grDevices utils     datasets  base     

other attached packages:
[1] ggplot2_0.9.3.1

loaded via a namespace (and not attached):
 [1] colorspace_1.2-2   dichromat_2.0-0    digest_0.6.3       grid_3.0.1        
 [5] gtable_0.1.2       labeling_0.1       MASS_7.3-26        munsell_0.4       
 [9] plyr_1.8           proto_0.3-10       RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2   

5年後の更新 (2018-08-02) : この問題は行き来します。ggplot2 2.2.1 では空のファイルが生成されませんが、ggplot2 3.0.0 では生成されます。ggplot2 チームは現在、これを修正するために取り組んでいます。開発履歴については、ggplot2 の問題#1326#2363#2758、および#2787を参照してください。

4

2 に答える 2

19

の幅と高さの引数のデフォルトを見ると、それらがとggsaveであることがわかります。これをコンソールで実行すると、グラフィックス ウィンドウがまだ開いていない場合は、開くことがわかります。par("din")[1]par("din")[2]

デバイスの幅/高さをインチ単位で取得するには、実際のデバイスが必要なので、このような方法は理にかなっています。par("din")デバイスが開いていない場合はエラーを返す必要があると主張する人もいると思いますggsave

確かに、から?par

現在のデバイスがヌル デバイスの場合、par はパラメータのクエリ/設定の前に新しいデバイスを開きます。

したがって、幅/高さを指定すると、スプリアス デバイスが開くのを防ぐことができます。

于 2013-06-27T16:48:31.530 に答える