2012-12-30 7 views
8

Sto girando intorno con una funzione in R, dove, per farla breve, ho un for -loop, e ad ogni passaggio, salvo un grafico usando png, quindi immediatamente readPNG in modo che io possa estrarre informazioni RGB. Quindi faccio un secondo grafico, quindi readPNG così posso confrontare l'RGB delle due immagini. Il problema è che continuo a ricevere un messaggio di errore sull'impossibilità di avviare il dispositivo png() o di aprire il file per la scrittura, dopo un numero di cicli (può essere ridotto a una manciata di loop o a pochi mille).Impossibile aprire il dispositivo png in loop

qui è davvero semplificato codice, ma ha lo stretto necessario, e genera il messaggio di errore:

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

E il messaggio di errore:

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 

Originariamente avevo graphics.off() come dev.off() ma poi pensai che il loop fosse così veloce che spegnere un dispositivo non era abbastanza veloce prima di dover essere di nuovo aperto e in qualche modo si stava "confondendo". Ho anche provato a utilizzare Sys.sleep(0.1) dopo ogni graphics.off, ma non è stato di alcun aiuto. Mi sto perdendo qualcosa di stupido e ovvio, o si tratta solo di un bug del dispositivo?

+0

@Your domanda finale : non ci sono problemi con dev.off, il codice viene eseguito in sequenza. Quindi, per quanto velocemente tutto accada, prima viene ucciso il dispositivo e quindi viene aperto un nuovo dispositivo. –

+3

Esegui questo codice in una console interattiva o utilizzando ad es. 'Rscript'. E, 'png' funziona con un codice ancora più minimale, ad es. : 'png (" bla.png "); trama (1:10); dev.off()'. –

+0

Invio la funzione da Tinn-R, quindi la chiamo da Rgui. Png funziona bene da solo. Ma ho appena scritto un semplice test in cui avevo il codice che hai suggerito, in un ciclo. L'ho provato 10 volte, nessun problema. Effettuato 100 volte e ottenuto questo: Errore in png ("test3.png"): impossibile avviare il dispositivo png() Inoltre: Messaggi di avviso: 1: In png ("test3.png"): Impossibile apri il file 'test3.png' per scrivere 2: In png ("test3.png"): dispositivo di apertura fallito (Mi dispiace, sono nuovo e la formattazione di un commento mi causa ancora problemi). – Herc

risposta

15

Ho avuto lo stesso problema, anche se non in una situazione di loop. Nel mio caso, era perché stavo indicando l'output .png in una directory che non esisteva.

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

Una volta ho creato la directory, e fatto riferimento in modo corretto, l'errore è andato via e ho avuto la mia immagine .png.

+0

Non sai quanto ti sia stato di aiuto! Passate ore a cercare di capire la perdita di memoria che altre risposte stavano menzionando ed era così semplice ... Grazie! –

+0

imposta il tuo wd con 'setwd()' prima di usare 'png()' – dudu

4

Ho riscontrato questo problema durante il salvataggio dei grafici anche in un ciclo. @Dino Fuoco mi ha dato un suggerimento, il mio nome del file loop-generato conteneva un carattere non valido ...

Assicurarsi che il nome del file è legale (cercare barre, e commerciali, apostrofi ecc)

+0

Questa è una risposta o un commento? Sembra più simile al secondo –

+0

Potrebbe essere formulato in entrambi i modi, era la risposta per me. Posso rimuoverlo se pensi che sia inappropriato. L'ho modificato – Alex

+3

Ignora la polizia di risposta Alex. Era una risposta per me. –