2011-01-21 54 views
28

我想編寫一個函數,向用戶顯示一個狀態消息,顯示類似時間,完成百分比和進程當前狀態的狀態消息。我可以處理組裝信息,但是我想要做的不只是打印到控制檯,而是讓它向上滾動,一條消息接着一條。我真的很喜歡這個消息,而不用像message()那樣滾動,也沒有任何圖形。這可能與R?顯示R中的狀態消息

+10

「這是R.沒有如果,只有怎麼樣。」 --Simon Blomberg –

回答

24

這樣的事情呢?

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

不要使用'cat()',使用'message()'(可以被抑制),例如今天在R-bloggers的帖子中討論了與cat()'抱怨。 –

+1

@Dirk:它必須是'message(...,appendLF = FALSE)',否則滾動消息會出現在OP特別想要避免的控制檯上。 – Sharpie

+0

@Dirk用'message()'替換'cat()'爲每個更新添加一個換行符。你需要額外做些什麼來防止換行嗎? FWIW,'txtProgressBar'使用'cat()'。 –

7

可能有更優雅的方式來做到這一點,但是這可以做到這一點:

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

} 

如果你自動生成你的消息,你需要計算有多少\ B個字符輸出以備份正確的金額,但這非常簡單。

17

utils包中包含txtProgressBar和用於更新它的函數,可用於顯示進程的完成百分比。

查看對txtProgressBar呼籲的更新的方式無需滾動控制檯處理實例期間創建的up1up2up3功能。

+2

太棒了!你也可以通過'tpb < - txtProgressBar(...)創建和設置你自己的更新函數。 myUpFun < - 函數(值){...}; tpb $ up < - myUpFun'。然後你可以用'message()'寫一個更新函數,這樣Dirk可以抑制噪聲。 ;-) –

+0

@Joshua:很好的觀察!當我在想創建一個自定義更新函數時,我想要複製並重寫'txtProgressBar()'來實現它。 – Sharpie

+0

還有'plyr :: progress_text'。它是'txtProgressBar'的簡單包裝,雖然... – aL3xa

15

這裏有一些金光閃閃的金光閃閃。從?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

這對於完整性來說確實很酷,但我目前的需求僅限於純文本解決方案。 –

+2

當tcltk彈出時,我沒有把你的問題讀到最後。這是一個衝動的答案,對此我表示歉意。也許你將來需要一些時間。 –

+0

+1非常棒。它甚至激勵我學習一點TclTk。 – Iterator