17

反復ごとに時間がかかるループがあり、その進行状況をリアルタイムで確認したいと考えています。ループの実行中に 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
4

2 に答える 2

22

最後のものはリアルタイムで印刷されます。次のように試してください。

for(i in 1:10){
  Sys.sleep(0.1)
  print(i)
}

これは Rstudio では問題ないように見えますが、従来の Rgui では、コンソールを更新するためにコンソールをクリックする必要があります (たとえば、スリープを長くすると、それSys.sleep(0.5)を確認するのに役立ちます)。flush.consolewhich を使用してバッファーをクリアすることで、これを回避できます。

for(i in 1:10){
  Sys.sleep(0.1)
  print(i)
  flush.console() 
}

または、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)

またはさらに良いもの:

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)
于 2013-03-28T05:47:43.250 に答える
4

このcat()関数を使用すると、便利な複雑なステートメントを作成して、スクリプトの進行状況を追跡できます

for(i in 1:10){
  ptm0 <- proc.time()
  Sys.sleep(0.5)  
  ptm1=proc.time() - ptm0
  jnk=as.numeric(ptm1[3])
  cat('\n','It took ', jnk, "seconds to do iteration", i)
}

>It took  0.49 seconds to do iteration 1
于 2013-03-28T06:30:53.027 に答える