2011-05-10 49 views
12

我一直在玩R函數txtProgressBar()。我怎樣才能劫持函數覆蓋控制檯中當前輸出的能力?在R控制檯中覆蓋當前輸出

即進度條更新這樣的:

> some R function 
============ 

成爲

> some R function 
======================== 

> some R function 
============ 
======================== 

例如,我怎麼寫函數,將顯示當前時間控制檯:

> some R function 
13:01 

成爲

> some R function 
13:02 

> some R function 
13:01 
13:01 
13:01 
13:01 
13:02 
13:02 
13:02 
13:02 
+0

答案在我的博客上進一步討論。無恥的自我宣傳:http://4dpiecharts.com/2011/05/11/a-clock-utility-via-console-hackery/ – 2011-05-11 14:20:49

回答

12

這個程序似乎工作:

while (1) { 
cat('\b\b\b\b\b\b',format(Sys.time(),'%H:%M')) 
flush.console() 
} 

是否有任何理由,這可能是一個壞主意?

/編輯:更好(感謝@格雷格雪):

while (1) { 
cat('\r',format(Sys.time(),'%H:%M:%S')) 
flush.console() 
} 
+0

\ b反斜槓字符可能會導致捕獲控制檯輸出的程序(如TextMate和SublimeText)出現問題。會發生什麼是輸出如下所示: (0 tests)\ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b(1 test)\ b \ b \ b \ b \ b \ b \ b \ b \ b \ b \ b ...(99次測試)\ b \ b \ b \ b \ b 沒有解決方案我找到了自動櫃員機,只是要記住,如果您打算將他人的作品發佈給他人使用 – Brandon 2011-09-21 21:37:28

+0

@布蘭登怎麼樣\ r? – Zach 2011-09-22 00:07:02

+0

@Zach我不知道,我只注意到\ b問題,當它成爲一個問題,我正在使用的東西 – Brandon 2011-10-17 12:38:28

1

我不認爲覆蓋可能在控制檯上。沒有退格轉義序列。可以繪製進度條,因爲cat函數不會發出cr,除非被告知這樣做。

編輯: 我錯了。退格字符被識別:

for (i in 1:1000) { 
    cat(as.character(Sys.time())) 
    flush.console() 
    for(i in 1:19) {cat("\8")} } 
+0

Got。。所以我可以打印'13:01'並更新爲'13:01 13:02'而不是'13:02'? – Zach 2011-05-10 17:14:32

4

當然,您可以:

while(1) { 
    cat("\b\b\b\b\b\b\b\b",format(Sys.time(), "%H:%M:%S"),sep="") 
} 
13

而不是 「\ B \ b \ B \ B」 你可以只使用「\ r」轉到行首並覆蓋行中的所有內容(確保仍然使用cat並且不要輸入換行符)。

儘管如果你想顯示進度,最好使用winProgressBar(僅限windows)或tkProgressBar(tcltk包,所有平臺),除了進度條外,還可以使用標籤更新。

在windows上,您還可以使用setWindowTitle或setStatusBar函數將該類型的信息放入較大窗口的頂部或底部。