web-dev-qa-db-ja.com

pngデバイスをループで開くことができません

私はRの関数をいじっています。ここでは、簡単に言えば、forループがあり、各ステップでpngを使用してプロットを保存し、すぐにreadPNGこれでRGB情報を抽出できます。次に、2番目のプロットを作成し、次にreadPNGこれを作成して、2つの画像のRGBを比較できるようにします。問題は、png()デバイスを起動できない、または書き込み用にファイルを開くことができないというエラーメッセージが、ループの数(ほんの一握りのループ、または数千もの)。

これは本当に単純化されたコードですが、必要最低限​​のものがあり、エラーメッセージを生成します。

_testfun<-function(beg,fini)
{
 library(png)
 setwd("D://mydirectory")
 for (i in beg:fini)
 {
  png("test.png",width=277,height=277) #candidate image
  par(mai=c(0,0,0,0))
  plot(1,type="n",ann=FALSE,xlim=c(0,255),ylim=c(0,255),
         xaxt="n",yaxt="n",frame.plot=F)
  polygon(x=c(10,60,60),y=c(10,10,60),col="red")
  graphics.off()

  image<-readPNG("test.png")
  #code where I get rgb values for original

  png("test2.png",width=277,height=277) #candidate image with diferent params
  par(mai=c(0,0,0,0))
  plot(1,type="n",ann=FALSE,xlim=c(0,255),ylim=c(0,255),
         xaxt="n",yaxt="n",frame.plot=F)
  polygon(x=c(10,60,60),y=c(10,10,60),col="blue")
  graphics.off()

  image<-readPNG("test2.png")
  #code where I get rgb values for second image, and compare
 }
}
_

そしてエラーメッセージ:

_Error in png("test.png", width = 277, height = 277) : 
  unable to start png() device
In addition: Warning messages:
1: In png("test.png", width = 277, height = 277) :
  Unable to open file 'test.png' for writing
2: In png("test.png", width = 277, height = 277) : opening device failed
_

もともと私はgraphics.off()dev.off()として持っていましたが、ループが速すぎて、1つのデバイスをオフにするのに十分な速さではなく、再び開く必要があり、「混乱」していたのではないかと思いました。何とかして。また、各_graphics.off_の後にSys.sleep(0.1)を使用してみましたが、それも役に立ちませんでした。私は愚かで明白な何かを見逃していますか、それともこれは単なるデバイスのバグですか?

11
Herc

ループ状態ではありませんが、同じ問題が発生しました。私の場合は、.png出力を存在しないディレクトリにポイントしていたためです。

png('./tweets/graphics/unique words.png', width=12, height=8, units='in', res=300)

ディレクトリを作成して正しく参照すると、エラーがなくなり、.png画像が表示されました。

20
Dino Fire

プロットをループに保存しているときにもこの問題が発生しました。 @Dino Fireからヒントが得られました。ループで生成されたファイル名に、不正な文字が含まれていました...

ファイル名が正しいことを確認してください(スラッシュ、アンパサンド、アポストロフィなどを探してください)。

8
Alex