在一条显示行上显示循环计数器

时间:2011-03-09 16:59:20

标签: r loops counter

我在R中运行以下类型的循环:

for(i in 1:N){...}

我想有一个计数器,显示循环进度中i的当前值。我希望这能跟踪我到达循环结束的距离。一种方法是简单地将print(i)插入循环代码中。如,

for(i in 1:N){
...substantive code that does not print anything...
print(i)
}

这可以完成工作,为您提供正在运行的i。问题是它在新行上打印每个值,la,

[1] 1
[1] 2
[1] 3

这会占用大量的控制台空间;如果N很大,它将耗尽所有控制台空间。我想要一个不会占用太多控制台空间的柜台。 (有时能够向上滚动控制台以检查确定您正在运行您认为正在运行的内容是很好的。)所以,我希望有一个显示为的计数器,

[1] 1 2 3 ...

一旦达到控制台宽度,继续进入新线路。我不时看到这个。任何使这种情况发生的技巧?

5 个答案:

答案 0 :(得分:9)

尝试使用函数flush.console()

for (i in 1:10){
 cat(paste(i, " ")); flush.console()
}

给出

1  2  3  4  5  6  7  8  9  10

这是对代码的一个小修改,它只打印一个单个数字,并在每次运行时递增。它使用回车符(\ r)序列来避免控制台中的一长串数字。

for(i in 1:100) {  
  Sys.sleep(.1)      # some loop operations
  cat(i, "of 100\r") 
  flush.console()
}

答案 1 :(得分:7)

查看函数txtProgressBar,winProgressBar(仅限windows)和tkProgressBar(tcltk包)作为在循环中显示进度的其他方法。

在某些控制台上,您还可以在cat语句中使用“\ r”或“\ b”返回到行的开头并覆盖上一个迭代编号。

答案 2 :(得分:2)

答案 3 :(得分:1)

尝试使用简单的循环:

 for(i in 1:100){
    Sys.sleep(.1) # Your code here
    cat("\r", i, "of", 100) 
    flush.console()
 }

或者对于嵌套循环:

for(i in 1:100){
  for(j in 1:100){
    Sys.sleep(.1)  # Your code here
    cat("\r", i, ".", j, "of", 100, "\r") 
    flush.console()
  }
}

答案 4 :(得分:0)

不是一个非常好的解决方案,但你可以在循环中尝试这样的事情:

cat(paste(i, ifelse(i %% 30 == 0,"\n"," ")))

但您必须手动调整30值才能适合控制台的宽度。