2012-12-30 30 views
8

R içinde bir işlevle uğraştım, uzun bir hikaye kısa, bir for -loop var ve her adımda, png kullanarak bir arsa kaydet, sonra hemen readPNG böylece RGB bilgilerini ayıklayabiliyorum. Daha sonra ikinci bir çizim yapın, sonra readPNG bu yüzden iki görüntünün RGB'sini karşılaştırabilirim. Sorun şu ki, png() aygıtını başlatamayan bir hata iletisi almaya veya dosyayı birkaç döngüden sonra açmak için hata ayıklamaya devam etmem gerekiyor (birkaç döngüden olabildiğince az veya birkaç bin). İşte Png aygıtını döngü içinde açılamıyor

gerçekten kod basitleştirilmiş, ancak hata mesajını çıplak temel vardır ve üretir:

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

Ve hata mesajı:

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 
Başlangıçta

Ben dev.off() olarak graphics.off() vardı ama sonra belki de döngü çok hızlı olduğunu düşündüm ki bir cihazı kapatmak, tekrar açılmaya ihtiyaç duymadan önce yeterince hızlı değildi ve bir şekilde 'kafası karışmış' oluyordu. Ayrıca her graphics.off'dan sonra Sys.sleep(0.1) kullanmayı denedim, ancak bu da işe yaramadı. Aptalca ve bariz bir şeyi mi özledim yoksa bu sadece bir cihaz hatası mı?

+0

@your Son bir soru (eğik çizgi, ve işareti kesme işareti vb arayın) içeriyordu : dev.off ile ilgili bir sorun yoktur, kod sırayla yürütülür. Bu yüzden her şey hızlı olur, önce cihaz öldürülür ve sonra yeni bir cihaz açılır. –

+3

Bu kodu etkileşimli bir konsolda mı çalıştırıyorsunuz veya ör. 'Rscript'. Ve, 'png' daha da az bir kodla çalışır, örn. : png ("bla.png"), arsa (1:10); dev.off() '. –

+0

Fonksiyonu Tinn-R'den yolluyorum, sonra sadece Rgui'den arayınız. Png kendi kendine iyi çalışıyor. Ama daha önce önerdiğin bir döngüye sahip olduğum basit bir test yazdım. 10 kere kaldı, sorun değil. 100 kez çalıştırdı ve bunu elde etti: png ("test3.png") hatası: png() aygıtını başlatılamıyor Ek: Uyarı iletileri: 1: png ("test3.png"): Yapılamıyor yazmak için 'test3.png' dosyasını açın 2: png'de ("test3.png"): açma aygıtı başarısız oldu (Üzgünüz, bu konuda yeniyim ve bir yorumu biçimlendirmek hala güçlük çekiyor.) – Herc

cevap

15

Bir döngü durumunda olmamasına rağmen aynı sorunla karşılaştım. Benim durumumda, .png çıktısını var olmayan bir dizine işaret ettiğimden kaynaklanıyordu.

Ben dizin oluşturduk ve doğru başvurulan kez
png('./tweets/graphics/unique words.png', width=12, height=8, units='in', res=300) 

, hata gittiler ve benim .png görüntü aldık.

+0

Bana ne kadar yardımcı olduğunu bilmiyorsun! Diğer cevapların bahsettiği bellek sızıntısını anlamaya çalışmak için saatler harcadı ve çok basitti ... Teşekkürler! –

+0

wd'nizi 'png()' – dudu

4

Bu sorunu bir döngüde de kaydederken yaptım. Ateş bana bir ipucu verdi @Dino, benim döngü oluşturulan dosya adı geçersiz bir karakter ...

dosya adı yasal olduğundan emin olun

+0

kullanmadan önce 'setwd()' ile ayarlayın. Bu bir cevap mı, yoksa bir yorum mu? Daha çok –

+0

gibi görünüyor. Her iki şekilde de ifade edilebilirdi, benim için cevaptı. Uygunsuz olduğunu düşünüyorsanız onu kaldırabilirim. Onu düzenledim. – Alex

+3

Yanıt polisi Alex'i dikkate almayın. Benim için bir cevaptı. –