2013-03-28 6 views
11

Ho un ciclo che richiede molto tempo per ogni iterazione e mi piacerebbe vederne il progresso in tempo reale. Come posso stampare una variabile all'interno di un ciclo for alla console in tempo reale, mentre il ciclo è in esecuzione? Ognuno di questi tutto stampa dopo il ciclo è finito, che è inutile per me:Come si stampa una variabile all'interno di un ciclo for sulla console in tempo reale, mentre il ciclo è in esecuzione, in R?

for(i in 1:10){ 
    write(i,stdout()) 
} 

for(i in 1:10){ 
    write(i,stderr()) 
} 

for(i in 1:10){ 
    print(i) 
} 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

risposta

13

L'ultima uno non stampare in tempo reale, provare in questo modo:

for(i in 1:10){ 
    Sys.sleep(0.1) 
    print(i) 
} 

Questo guarda bene in Rstudio , ma nel classico Rgui devi fare clic sulla console per aggiornarlo (aumentando il sonno ad esempio tramite Sys.sleep(0.5) aiuta a vederlo). È possibile aggirare che utilizzando flush.console che cancella il buffer:

for(i in 1:10){ 
    Sys.sleep(0.1) 
    print(i) 
    flush.console() 
} 

o in Windows è possibile selezionare Misc nella barra degli strumenti superiore e deselezionare la buffered output.


Se il vostro obiettivo è quello di seguire il processo del vostro ciclo, il metodo di cui sopra si sente po 'fastidioso (almeno ai miei occhi) quando si esegue attraverso gran numero di iterazioni. In tal caso potrebbe essere più piacevole da usare barre di avanzamento:

n<- 1000 
pb <- txtProgressBar(min = 0, max = n, style = 3) #text based bar 
for(i in 1:n){ 
    Sys.sleep(0.001) 
    setTxtProgressBar(pb, i) 
} 
close(pb) 

o qualcosa di ancora più bello:

library(tcltk) 
n<- 1000 
pb <- tkProgressBar(title = "Doing something", min = 0, max = n, width = 200) 
for(i in 1:n){ 
    Sys.sleep(0.001) 
    setTkProgressBar(pb, i, label=paste(round(i/n*100,1),"% done")) 
} 
close(pb) 
+0

Oops, sarebbe stato probabilmente una buona idea fare un esempio reale. Grazie per aver chiarito le cose. – Eric

+0

Eric, controlla la mia risposta aggiornata, ho aggiunto esempi di funzioni che ti rendono una buona barra di avanzamento. –

3

La funzione gatto ti permette di fare affermazioni complessi utili per tenere traccia dei progressi nello script

for(i in 1:10){ 
    ptm0 <- proc.time() 
    Sys.sleep(0.5) 
    ptm1=proc.time() - ptm0 
    jnk=as.numeric(ptm1[3]) 
    cat('\n','It took ', jnk, "seconds to do iteration", i) 
} 

>It took 0.49 seconds to do iteration 1 
+0

Stavo pensando di aggiungere tempo in secondi per ogni iterazione. +1 – Eric

Problemi correlati