【问题标题】:Printing repetetively on the same line in R在R中的同一行上重复打印
【发布时间】:2014-01-29 07:18:39
【问题描述】:

我只是想知道在 R 中保持循环在同一行上打印以避免淹没控制台的最佳方法是什么?假设打印一个指示您的进度的值,如

for (i in 1:10) {print(i)}

编辑:

我尝试在每个值之前插入回车

for (i in 1:10000) {cat("\r",i)}

但这也不太有效,因为它只会在循环后更新屏幕上的值,在这种情况下只返回 10000....有什么想法吗?

注意,这不是要制作进度条,因为我知道有各种功能,但只是为了能够在某些循环的进程中打印一些信息而不会淹没控制台

【问题讨论】:

  • 对于简单的进度条,检查 ?txtProgressBar
  • 可能每次都停止打印?通常的方式是if(i%%100 ==0) print('working...')
  • 是的,谢谢 Carl - 我经常使用它,但即便如此,最好不要用所有输出淹没控制台...

标签: r printing


【解决方案1】:

你有答案,只是循环太快了,你看不到。试试:

for (i in 1:10) {Sys.sleep(1); cat("\r",i)}

编辑:实际上,这与@Simon O'Hanlon 的答案非常接近,但考虑到 cmets 的混乱以及不完全相同的事实,我将把它留在这里。

【讨论】:

  • 非常感谢 - 哈,那时我已经不远了!我想我期待一些结果,例如 for (i in 1:10000) {Sys.sleep(1/30); cat("\r",i)} 但当然这并不理想,因为那样会延迟很多事情,所以只打印这么多元素仍然是最好的,然后我猜......谢谢!
  • +1 我真的应该试过"\r"!!我确实说过一些明亮的火花会解决的!
【解决方案2】:

尝试使用cat()...

for (i in 1:10) {cat(paste(i," "))}
#1  2  3  4  5  6  7  8  9  10  

cat() 执行的转换比print() 少得多(来自马嘴)。

要在同一个地方重复打印,您需要清除控制台。我不知道另一种方法可以做到这一点,但感谢this great answer 这有效(至少在 Windows 上的 RStudio 中):

for (i in 1:1e3) {
  cat( i )
  Sys.sleep(0.01)
  cat("\014")
}

【讨论】:

  • 非常感谢 - 是的,这已经更好了!但是在打印每个值时没有办法回到行首(即叠印前一个值)?是的,@tonytonov 我知道那些文本进度条,但这更多是为了能够打印出某种信息而不会弄乱控制台......也许通过用回车或其他东西分隔值?
  • 非常感谢 - 虽然我不想清除整个控制台,但它仍然不完全是我所需要的 - 我只想继续在同一个地方打印。我试过 for (i in 1:10000) {cat("\r",paste(i," "))};但这也不太有效,因为它只会在循环后更新值....
  • @TomWenseleers 我明白你想做什么,我只是不确定有没有办法做到这一点(但不要相信我的话——我相信一些明亮的火花会想办法)。抱歉,我无法提供更多帮助。
  • 不过感谢指针 - 清除控制台已经是一件很方便的事情了!
【解决方案3】:

嗯...您是担心挂起,还是只是担心在作业完成时收到通知?

在第一种情况下,我会坚持我的 j%%N 建议,其中 N 足够大,您不会淹没控制台。

在第二种情况下,在脚本或函数中添加最后一行,例如调用“Beep”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-25
    • 2021-08-21
    • 2013-11-30
    • 2012-08-15
    • 2013-06-27
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多