2011-01-21 45 views
28

Tôi muốn viết một chức năng hiển thị cho người dùng thông báo trạng thái hiển thị nội dung như thời gian, phần trăm hoàn thành và trạng thái hiện tại của quy trình. Tôi có thể xử lý việc lắp ráp tin nhắn, nhưng tôi muốn làm một cái gì đó khác hơn là chỉ in ra bàn điều khiển và nó di chuyển lên, một tin nhắn sau cái kia. Tôi thực sự muốn tin nhắn thay đổi mà không cần cuộn như message() và không có bất kỳ đồ họa nào. Điều này có thể với R?hiển thị thông báo trạng thái trong R

+10

"Đây là R. Không có nếu. Chỉ như thế nào." --Simon Blomberg –

Trả lời

24

Làm thế nào về một cái gì đó như thế này?

for(i in 1:10) { 
    Sys.sleep(0.2) 
    # Dirk says using cat() like this is naughty ;-) 
    #cat(i,"\r") 
    # So you can use message() like this, thanks to Sharpie's 
    # comment to use appendLF=FALSE. 
    message(i,"\r",appendLF=FALSE) 
    flush.console() 
} 
+6

Không sử dụng 'cat()', sử dụng 'message()' (có thể bị chặn) như được thảo luận trên một bài đăng R-bloggers ngày hôm nay tranh luận với 'cat()'. –

+1

@Dirk: Nó sẽ phải là 'message (..., appendLF = FALSE)' --- nếu không thì các tin nhắn cuộn sẽ xuất hiện trên bàn điều khiển mà OP đặc biệt muốn tránh. – Sharpie

+0

@Dirk thay thế 'cat()' bằng 'message()' thêm một dòng mới với mỗi lần cập nhật. Bạn có phải làm gì đó để ngăn chặn dòng mới không? FWIW, 'txtProgressBar' sử dụng' cat() '. –

7

Có thể có nhiều cách thanh lịch để làm điều này, nhưng điều này có thể làm điều đó:

test.message <- function() { 
    for (i in 1:9){ 
    cat(i) 
    Sys.sleep(1) 
    cat("\b") 
    } 

} 

Nếu bạn đang tự động tạo ra thông điệp của bạn, bạn sẽ cần phải tính toán có bao nhiêu ký tự \ b để đầu ra để sao lưu số tiền chính xác, nhưng điều đó khá đơn giản.

17

Gói utils chứa txtProgressBar và các chức năng để cập nhật nó có thể được sử dụng để hiển thị phần trăm hoàn thành quy trình.

Xem các chức năng up1, up2up3 được tạo trong khi gọi đến txtProgressBar để biết các ví dụ về cách cập nhật được xử lý mà không cần cuộn bảng điều khiển.

+2

Thật tuyệt vời! Bạn cũng có thể tạo và thiết lập chức năng cập nhật của riêng bạn thông qua: 'tpb <- txtProgressBar (...); myUpFun <- function (value) {...}; tpb $ lên <- myUpFun'. Sau đó, bạn có thể viết một hàm cập nhật bằng cách sử dụng 'message()' để Dirk có thể ngăn chặn tiếng ồn. ;-) –

+0

@Joshua: Quan sát tốt! Khi tôi đang cân nhắc việc tạo một hàm cập nhật tùy chỉnh, tôi đã hình dung phải sao chép và viết lại 'txtProgressBar()' để thực hiện nó. – Sharpie

+0

Ngoài ra còn có 'plyr :: progress_text'. Đó là một trình bao bọc đơn giản cho 'txtProgressBar', mặc dù ... – aL3xa

15

Đây là một số bling bling. Từ ?tcltk::tkProgressBar.

pb <- tkProgressBar("test progress bar", "Some information in %", 
     0, 100, 50) 
Sys.sleep(0.5) 
u <- c(0, sort(runif(20, 0 ,100)), 100) 
for(i in u) { 
    Sys.sleep(0.1) 
    info <- sprintf("%d%% done", round(i)) 
    setTkProgressBar(pb, i, sprintf("test (%s)", info), info) 
} 
Sys.sleep(5) 
close(pb) 

alt text

+1

thực sự tuyệt vời để có đầy đủ, nhưng nhu cầu hiện tại của tôi là dành cho giải pháp văn bản duy nhất. –

+2

Tôi đã không đọc câu hỏi của bạn để kết thúc khi tcltk xuất hiện. Đó là một câu trả lời thúc đẩy, mà tôi xin lỗi. Có lẽ bạn từ tương lai sẽ cần nó một ngày nào đó. –

+0

+1 Tuyệt vời. Nó thậm chí còn truyền cảm hứng cho tôi để tìm hiểu một chút về TclTk. – Iterator

Các vấn đề liên quan