Tracciare durante un ciclo in RStudio

Sto implementando una soluzione al Travelling Salesman Problem (TSP) in R (simulation Annealing) e voglio produrre periodicamente il percorso migliore corrente. Ho cercato un bel po ‘per come generare i grafici durante un ciclo for e fino ad ora sono falliti.

Io uso RStudio e voglio vedere i grafici così come sono generati. Se hai mai visto i solutori di TSP fare le loro cose, capirai quanto è bello da guardare. Ecco un esempio dell’output grafico che voglio vedere http://www.staff.science.uu.nl/~beuke106/anneal/anneal.html

Non penso che l’utilizzo della memoria sarà un problema (durante circa 500.000 iterazioni, mi aspetto solo 50-100 grafici). Ecco una funzione di esempio, in cui ci aspettiamo di vedere 10 diversi grafici durante il tempo in cui la funzione viene eseguita:

 Plotz <- function(iter = 1000000, interval = 100000) { x <- 1:10 for(i in 1:iter){ y <- runif(10) if(i %% interval == 0) { plot(x, y) } } return(c(x, y)) } Plotz() 

Quando eseguo questo, tutto quello che vedo è la trama finale prodotta (in RStudio). Come posso vedere le trame mentre vengono generate?

Inoltre: sono su Ubuntu (qualunque sia la versione stabile più recente). Non so se questo è rilevante.

Grazie a tutti in anticipo.

EDIT: per suggerimento di Captain Murphy, ho provato a farlo sul terminale Linux, e la grafica è apparsa. Continuo a pensare alla domanda “Come farlo in RStudio?” È ancora rilevante, tuttavia. È un buon programma, quindi forse qualcuno ha un’idea di cosa si potrebbe fare per farlo funzionare?

EDIT2: come affermato da Thilo, questo è un bug noto in Rstudio. Se qualcuno ha altre idee per risolvere questo problema senza il software stesso, allora c’è ancora qualcosa da discutere. Altrimenti, considera questa domanda risolta.

Una cosa che puoi fare è aprire una finestra x11 e tracciarne la trama:

 x11() Plotz() 

Questo dovrebbe funzionare come nel terminale.

Chiamare Sys.sleep (0) dovrebbe causare il disegno da disegnare. A differenza della soluzione X11, funzionerà anche su versioni server di RStudio.

(Sono stato sorpreso dal fatto che dev.flush () non ha dato il risultato che speravi, potrebbe essere un bug.)

Seguendo la risposta di @ JoeCheng e il commento di @RGuy su quella risposta: mentre lavoravo con la gente di RStudio , il problema sembra sopraggiungere principalmente quando c’è troppa trama in un intervallo di tempo troppo breve. La soluzione è duplice:

  • Sys.sleep(0) consente di forzare un aggiornamento alla finestra di stampa.
  • Tracciamento degli aggiornamenti ogni ciclo Wth piuttosto che ogni ciclo.

Ad esempio, sul mio computer (i7, RStudio Server), il seguente codice non si aggiorna fino al completamento del ciclo:

 N <- 1000 x <- rep(NA,N) plot(c(0,1)~c(0,N), col=NA) for(i in seq(N)) { Sys.sleep(.01) x[i] <- runif(1) iseq <- seq(i-99,i) points( x[i]~i ) Sys.sleep(0) } 

Il seguente codice si aggiorna in tempo reale, nonostante abbia lo stesso numero di punti da tracciare:

 N <- 1000 x <- rep(NA,N) plot(c(0,1)~c(0,N), col=NA) for(i in seq(N)) { Sys.sleep(.01) x[i] <- runif(1) iseq <- seq(i-99,i) if(i%%100==0) { points( x[iseq]~iseq ) Sys.sleep(0) } } 

In altre parole, è il numero di chiamate che la plot sembra avere importanza, non la quantità di dati da tracciare.

Se vuoi salvare anche i grafici, puoi semplicemente aprire un nuovo dispositivo nel loop e chiuderlo in seguito.

 Plotz <- function(iter = 1000, interval = 100) { x <- 1:10 p <- 0 #plot number for(i in 1:iter){ y <- runif(10) if(i %% interval == 0) { png(file=paste(i,"png",sep=".")) p <- p + 1; plot(x, y) dev.off() } } return(c(x, y)) } 
 Plotz <- function(iter = 1000, interval = 100) { x <- 1:10 p <- 0 #plot number for(i in 1:iter){ y <- runif(10) if(i %% interval == 0) { p <- p + 1; plot(x, y) readline("Please press the Enter key to see the next plot if there is one.") } } return(c(x, y)) } Plotz() 

Puoi anche usare le frecce indietro nella scheda grafici del pannello in basso a sinistra dell’interfaccia RStudio per visualizzare i grafici.

Puoi usare il pacchetto animate per stratificare i tuoi grafici in una GIF.