2014-04-01 35 views
3

此代碼讓我留在R控制檯一個不錯的消息(在Windows上),沒有填滿屏幕:如何在RStudio中提供整潔的R控制檯更新消息?

imax <- 2000 
for (i in seq_len(imax)) { 
    mess <- sprintf("slightly different length message: %i", i) 
    message(paste(rep("\b", nchar(mess)), collapse = ""), appendLF = FALSE) 
    message(mess, appendLF = i == imax) 
    flush.console() 
} 

在RStudio退格符不工作,我得到可怕的附加信息無處不在。

如何在Rgui和RStudio中很好地做到這一點?

跨平臺呢?

+0

用'cat'代替'message'在RStudio中適用於我。當然,你需要刪除'appendLF'部分。 – Dason

+0

是的,謝謝 - 希望避免貓()建成一個包。我不清楚這是否被皺起了眉頭(a la suppressMessages)。使用貓的交互式()測試可能就足夠了。 – mdsumner

回答

4

你是否需要實際的價值/信息,或者你只是想顯示進度?

如果是後者,txtProgressBar()可能就足夠了:

imax <- 2000 
msg <- txtProgressBar(min=1, max=length(seq_len(imax)), initial=1) 
for (i in seq_len(imax)) { 
    setTxtProgressBar(msg, i) 
    Sys.sleep(0.001) # so it will show something vs just fly through the loop 
} 
close(msg) 

如果你需要的值/消息,並與剛剛沒有它是一個實際的診斷消息確定,然後cat應該這樣做:

imax <- 2000 
for (i in seq_len(imax)) { 
    mess <- sprintf("slightly different length message: %i", i) 
    cat(paste(rep("\b", nchar(mess)), collapse = "")) 
    cat(mess) 
    if (i == imax) { cat("\n") } 
    Sys.sleep(0.001) # again, loop is too fast to show w/o a delay 
} 

編輯/添加從最初提交:

做了一些ADDIT離子測試,它的輸出爲stderr,這導致了RStudio控制檯區域的不同行爲。當我打電話.makeMessage直接再使用cat與輸出要stdout VS stderr它的工作原理:

imax <- 2000 
for (i in seq_len(imax)) { 
    mess <- sprintf("slightly different length message: %i", i) 
    cat(.makeMessage(paste(rep("\b", nchar(mess)), collapse = ""), domain=NA, appendLF = FALSE)) 
    cat(.makeMessage(mess, domain=NA, appendLF = (i == imax))) 
    Sys.sleep(0.001) # delay...see above snippets 
    flush.console() 
} 

添加file=stderr()cat的,它會表現得原來message呼叫的方式做。