51

我想在我长时间运行的算法中输出一个进度指示器。我可以很容易地从我的算法中“冒泡”一个进度值(例如,通过专门为此目的调用提供的函数回调),但困难在于实际的文本输出过程。每次调用print都会创建一个新行,并且每个都以[1].

有没有办法在不同的时间打印而不引入换行符?

具体来说,我想实现一个“动画”,如果在两个不同的时间观察,它看起来像下面这样。

0%...

...

0%...2%...4%...
4

5 回答 5

60

使用cat()代替print()

cat("0%")
cat("..10%")

输出:

0%..10%
于 2013-01-18T09:15:49.553 回答
13

呸,安德烈以 28 秒的优势击败了我。

> for (i in 1:10) {
+ cat(paste("..", i, ".."))
+ }
.. 1 .... 2 .... 3 .... 4 .... 5 .... 6 .... 7 .... 8 .... 9 .... 10 ..
于 2013-01-18T09:16:40.527 回答
9

也许你可以plyr

  l_ply(1:4,function(x) x+1,.progress= progress_text(char = '+'),.print=TRUE)
  |                                 |   0%[1] 2
  |++++++                           |  25%[1] 3
  |+++++++++++++++                  |  50%[1] 4
  |++++++++++++++++++++++           |  75%[1] 5
  |++++++++++++++++++++++++++++++++ |  100%[1]
于 2013-01-18T09:18:19.437 回答
6

如果您真的需要这样的进度条,请使用txtProgressBar控制台输出。或者winProgressBar在 Windows 下查看窗口进度条。

于 2013-01-18T09:31:17.563 回答
1

我相信您正在寻找\r如下cat功能:

for(i in 1:100) {
    cat('\r',
            i,
            '% |',
            rep('=', i / 4),
            ifelse(i == 100, '|\n',  '>'), sep = '')
    Sys.sleep(.1)
}
于 2019-05-20T10:30:31.107 回答