webdevqa.jp.net

forループでPDF

プロットをループして、プロットの結果をPDFに入れたいと思います。

これを行うには、次のコードを使用します。

これは、3回ループし、虹彩データセットから3つの異なるプロットをプロットします。次に、それをC:/ドライブに保存する必要があります。 PDFファイルが作成されましたが、破損しています。

for(i in 1:3){
  pdf(paste("c:/", i, ".pdf", sep=""))
  plot(cbind(iris[1], iris[i]))
  dev.off()
}
23
Sir Ksilem

デバイスにラティスプロットを描画するには、ラティスグラフィック関数の1つを呼び出して生成されたオブジェクトを印刷する必要があります。通常、インタラクティブな使用では、Rは割り当てられていない場合、オブジェクトを自動印刷します。ただし、ループでは自動印刷が機能しないため、通常はオブジェクトをprint()でラップして、オブジェクトを印刷するように調整する必要があります。

ここに例があります(式表記の乱用を許してください;-):

require(lattice)
for(i in 1:3) {
    pdf(paste("plot", i, ".pdf", sep = ""))
    print(xyplot(iris[,1] ~ iris[,i], data = iris))
    dev.off()
}

これにより、pdfデバイス上に3つのプロットが生成されます。

「c:/」を含むファイル名は、OS上で有効なファイル名ですか?これは、pdfを呼び出す前に設定したい作業ディレクトリの一部のように見えます。そのファイルを開くことができないというエラーが表示されます。

_Error in pdf(paste("c:/", i, ".pdf", sep = "")) : 
  cannot open file 'c:/1.pdf'
_

ファイル名から「c:/」ビットを削除すると、3つのPDFが正しく生成されます。また、dev.off()をforループの外側に移動すると、3つのPDFではなく3つのページを持つ単一のPDFが得られます。欲しいです...

_for(i in 1:3){
  pdf(paste("plot", i,".pdf",sep=""))
  plot(cbind(iris[1],iris[i]))
  dev.off()
}
_
3
Chase