如何在循环运行时,在R中实时将for循环中的变量打印到控制台?

Eri*_*ric 15 printing loops r

我有一个循环,每次迭代需要很长时间,我希望实时看到它的进展.当循环运行时,如何实时将for循环中的变量打印到控制台?在循环结束后,每个都打印出来,这对我来说没用:

for(i in 1:10){
  write(i,stdout())
}

for(i in 1:10){
  write(i,stderr())
}

for(i in 1:10){
  print(i)
}
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)

Jou*_*ske 18

最后一个实时打印,尝试这样:

for(i in 1:10){
  Sys.sleep(0.1)
  print(i)
}
Run Code Online (Sandbox Code Playgroud)

这在Rstudio中看起来很好,但是在经典的Rgui中你必须单击控制台才能刷新它(例如通过Sys.sleep(0.5)帮助看到它来增加睡眠).您可以通过使用flush.console清除缓冲区来避免这种情况:

for(i in 1:10){
  Sys.sleep(0.1)
  print(i)
  flush.console() 
}
Run Code Online (Sandbox Code Playgroud)

或者在Windows中,您可以Misc在上方工具栏中选择并取消选中buffered output.


如果你的目标是跟踪你的循环过程,那么当你经历大量的迭代时,上面的方法感觉有点麻烦(至少在我看来).在这种情况下,使用进度条可能更好:

n<- 1000
pb <- txtProgressBar(min = 0, max = n, style = 3) #text based bar
for(i in 1:n){
   Sys.sleep(0.001) 
   setTxtProgressBar(pb, i)
}
close(pb)
Run Code Online (Sandbox Code Playgroud)

或者甚至更好的东西:

library(tcltk)
n<- 1000
pb <- tkProgressBar(title = "Doing something", min = 0, max = n, width = 200)
for(i in 1:n){
   Sys.sleep(0.001) 
   setTkProgressBar(pb, i, label=paste(round(i/n*100,1),"% done"))
}
close(pb)
Run Code Online (Sandbox Code Playgroud)