2012-01-07 17 views
14

Sto implementando una soluzione al problema del venditore ambulante (TSP) in R (Ricottura simulata) e voglio produrre periodicamente il percorso migliore corrente. Ho cercato un po 'come stampare i grafici durante un ciclo for e fino ad ora sono falliti.Plottaggio durante un loop in RStudio

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 credo che l'utilizzo della memoria sarà un problema (durante circa 500.000 iterazioni, mi aspetto solo 50-100 grafici). Ecco una funzione di esempio, dove ci si aspetterebbe di vedere 10 appezzamenti diversi durante il tempo della funzione viene eseguito:

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.

MODIFICA: Per suggerimento di Captain Murphy, ho provato a farlo nel 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, si tratta di 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.

+1

Provate il vostro codice nella console R standard (non in R studio). Le trame iterative sembrano apparire per me, non solo una alla fine. –

+1

Non so se l'hai visto, ma ci sono delle frecce avanti e indietro nel pannello trama in RStudio che sono in realtà un ottimo modo per farti scorrere tra le trame generate (non le ho notate per un po ') . Ovviamente non si vedono le trame come vengono generate, ma in seguito è possibile scorrere le trame tutte le volte che si desidera. –

+4

Non ho una risposta completa per te, ma forse qualche informazione: Sembra che questo sia (era?) Un bug in RStudio nel 2011. Vedi http://support.rstudio.org/help/discussions/suggestions/214- plot-should-update-in-real-time-osx – Thilo

risposta

8

Una cosa che puoi fare è aprire una finestra x11 e la trama in là:

x11() 
Plotz() 

che dovrebbe funzionare lo stesso come eseguirlo in terminale.

1
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() 
1

È anche possibile utilizzare le frecce indietro nella scheda grafica del riquadro in basso a sinistra dell'interfaccia RStudio per visualizzare i grafici.

16

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

(mi ha sorpreso che dev.flush() non ha dato il risultato che speravi, che potrebbe essere un bug.)

+1

Questa è una buona soluzione. La differenza tra questo e @Sacha è che se generiamo molti grafici in un breve periodo, questo (almeno sul mio sistema) non mostrerà sempre tutti i grafici se vengono generati troppo velocemente. Questo non è necessariamente un aspetto negativo, a seconda che tu voglia vedere tutte le trame o se il tuo obiettivo è solo avere un'idea generale di quale sia lo stato corrente del sistema TSP. Per i miei scopi, la soluzione x11() funziona meglio, ma anche questa è ottima. – Rguy

2

Se si desidera salvare le trame così si potrebbe semplicemente aprire una nuova 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)) 
} 
7

Facendo seguito a @ risposta di JoeCheng e @ commento di RGuy su quella risposta: come ho worked out with the RStudio folks, il problema sembra nascere soprattutto quando c'è troppo tracciato in corso in troppo breve un periodo. La soluzione è duplice:

  • Sys.sleep(0) consente di forzare un aggiornamento alla finestra di stampa.
  • Pianificare gli aggiornamenti ogni ciclo W anziché ogni ciclo.

Per esempio, sul mio computer (i7, RStudio Server), il seguente codice non aggiorna fino a quando il ciclo completa:

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

I seguenti aggiornamenti del codice in tempo reale, pur avendo 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 al plot che sembra alla materia, non è la quantità di dati da tracciare.

+1

Il mio problema è quando devo tracciare una finestra TCL TK? Non riesco a trovare il modo di aggiornare la mia finestra. Quando eseguo 'Sys.sleep (0)', si sta aggiornando ma non riesco a vedere le modifiche finché non si sposta (letteralmente) la finestra tenendo e spostando la barra del titolo. – David

0

È possibile utilizzare il pacchetto animato per sovrapporre i grafici in una GIF.

Problemi correlati