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

22
我一直在使用 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

进一步讨论的答案可以在我的博客上找到。不要害羞地自我推广:http://4dpiecharts.com/2011/05/11/a-clock-utility-via-console-hackery/ - Richie Cotton
现在,包progress也许是显示漂亮格式和可自定义进度条的选项。 - hplieninger
5个回答

25

这个程序似乎是有效的:

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() 
}

\b 反斜杠字符可能会影响捕获控制台输出的程序(如TextMate和SublimeText)。 发生的情况是输出结果看起来像这样:(0 tests)\b \b \ b \ b \ 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 \ b \ b \ b \ b \ b \ b \ b ...(99 tests)\b \ b \ b \ b \ b \ b \ b \ b \ b目前我没有找到解决方案,但如果您计划发布您的工作供他人使用,请记住这一点。 - Brandon
@Zach 我不知道,只有当\b成为我正在使用的某些东西的问题时,我才注意到它。 - Brandon

22

你可以使用"\r"来回到行首并覆盖该行的所有内容,而不是使用"\b\b\b\b"(确保仍然使用cat命令,不要插入换行符)。

如果您想显示进度,最好使用winProgressBar(仅限Windows)或tkProgressBar(tcltk包,所有平台),它们除了进度条外还可以更新标签。

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


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

3

如果你想使用message函数打印一些内容,你可以将它的参数appendLF设置为FALSE,以避免它打印一个新行。然后使用回车符('\r')字符返回到行的开头,例如:

for (i in 1:5) {
  message('\r', i, appendLF = FALSE)
}

1
不错的想法,但是当较短的字符串在较长的字符串之后传递时,它会在控制台中留下一些“残留”字符: m = c('Test', 'Test2', 'Test very long string', 'Short Test'); for (i in m) { Sys.sleep(0.3); message('\r', i, appendLF = FALSE) } - andschar

1

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

编辑: 我错了。回退字符是被识别的:

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

明白了。所以我可以打印出 13:01 并将其更新为 13:01 13:02,但不能更新为 13:02 - Zach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接