覆盖R控制台中的当前输出

时间:2011-05-10 17:07:57

标签: r date time console

我一直在玩R函数txtProgressBar()。如何劫持函数在控制台中覆盖当前输出的能力?

即。进度条更新如下:

> 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

5 个答案:

答案 0 :(得分:13)

这个程序似乎有效:

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

这有什么理由可能是一个坏主意吗?

/编辑:甚至更好(感谢@Greg Snow):

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

答案 1 :(得分:13)

而不是“\ b \ b \ b \ b”你可以只使用“\ r”转到行的开头并覆盖该行的所有内容(确保仍然使用cat但不要放入换行)。

虽然如果你想显示进度,最好使用winProgressBar(仅限windows)或tkProgressBar(tcltk包,所有平台),除了进度条之外,还可以使用标签进行更新。

在Windows上,您还可以使用setWindowTitle或setStatusBar函数将该类型的信息放入较大窗口的顶部或底部。

答案 2 :(得分:4)

当然可以:

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

答案 3 :(得分:1)

我不认为在控制台上可以覆盖。没有退格转义序列。可以绘制进度条,因为cat函数不会发出cr,除非被告知这样做。

编辑: 我错了。退格字符被识别:

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

答案 4 :(得分:1)

如果要使用函数message打印内容,可以将其参数appendLF设置为FALSE,以避免它打印新行,然后使用回车符{{1} }字符返回到行首,例如:

('\r')