2013-03-28 19 views
11

Tôi có một vòng lặp mất nhiều thời gian cho mỗi lần lặp lại và tôi muốn xem tiến độ của nó trong thời gian thực. Làm cách nào để in một biến trong vòng lặp for vào giao diện điều khiển trong thời gian thực, vì vòng lặp đang chạy? Mỗi tất cả mọi thứ in sau khi vòng lặp kết thúc, mà là vô ích cho tôi:Làm cách nào để in một biến trong vòng lặp for vào bàn điều khiển trong thời gian thực, vì vòng lặp đang chạy, trong 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 

Trả lời

13

Người cuối cùng không in trong thời gian thực, hãy thử nó như thế này:

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

này có vẻ tốt đẹp trong Rstudio , nhưng trong Rgui cổ điển, bạn phải bấm vào giao diện điều khiển để nó làm mới (tăng giấc ngủ ví dụ bằng cách Sys.sleep(0.5) giúp thấy điều đó). Bạn có thể phá vỡ mà bằng cách sử dụng flush.console mà xóa bộ đệm:

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

Hoặc trong Windows bạn có thể chọn Misc trong thanh công cụ phía trên và bỏ chọn buffered output.


Nếu mục tiêu của bạn là để theo dõi quá trình vòng lặp của bạn, các phương pháp trên cảm thấy chút akward (ít nhất là đối với mắt của tôi) khi bạn đang chạy thông qua số lượng lớn các lần lặp lại. Trong trường hợp đó nó có thể đẹp hơn để sử dụng thanh tiến trình:

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) 

Hoặc một cái gì đó thậm chí đẹp hơn:

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

Rất tiếc, có thể bạn nên tạo một ví dụ thực tế. Cảm ơn bạn đã xóa mọi thứ. – Eric

+0

Eric, kiểm tra câu trả lời cập nhật của tôi, tôi đã thêm các ví dụ về chức năng mà làm cho bạn một thanh tiến trình tốt đẹp. –

3

Chức năng mèo cho phép bạn lập báo cáo phức tạp hữu ích để theo dõi sự tiến bộ trong kịch bản của bạn

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

Tôi đã nghĩ đến việc thêm thời gian tính bằng giây cho mỗi lần lặp lại. +1 – Eric