我一直在玩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
答案 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')