2013-03-28 5 views
11

Mam pętlę, która zajmuje dużo czasu dla każdej iteracji i chciałbym zobaczyć jej postęp w czasie rzeczywistym. Jak wydrukować zmienną wewnątrz pętli for na konsolę w czasie rzeczywistym, gdy pętla jest uruchomiona? Każdy z tych wszystkich wydruku po zakończeniu pętli, który jest bezużyteczny dla mnie:Jak wydrukować zmienną wewnątrz pętli for do konsoli w czasie rzeczywistym, jak działa pętla, w 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 

Odpowiedz

13

Ten ostatni jest drukowana w czasie rzeczywistym, spróbuj tak:

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

To wygląda dobrze w Rstudio , ale w klasycznym Rgui musisz kliknąć konsolę, aby odświeżyć (zwiększenie snu, na przykład o Sys.sleep(0.5) pomaga to zobaczyć). Można obejść, że za pomocą flush.console który czyści bufor:

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

lub Windows można wybrać Misc w górnym pasku narzędzi i odznacz buffered output.


Jeśli twoim celem jest, aby śledzić proces swojej pętli, powyższa metoda czuje się nieco akward (przynajmniej w moich oczach), gdy są uruchomione przez dużą liczbę iteracji. W tym przypadku może to być ładniejszy używać pasków postępu prac:

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) 

czy coś jeszcze ładniejszy:

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

Ups, to byłby dobry pomysł, aby zrobić prawdziwy przykład. Dzięki za oczyszczenie. – Eric

+0

Eric, sprawdź moją zaktualizowaną odpowiedź, dodałem przykłady funkcji, które sprawiają, że ładne paski postępu. –

3

Funkcja kot pozwala na wykonywanie użytecznych złożonych sprawozdań śledzić postęp w skrypcie

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

Myślałem o dodaniu czasu w sekundach dla każdej iteracji. +1 – Eric