Подтвердить что ты не робот

Как распечатать переменную в цикле for на консоли в режиме реального времени, когда цикл запущен, в 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
4b9b3361

Ответ 1

Последний печатает в реальном времени, попробуйте сделать это следующим образом:

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

Это отлично выглядит в Rstudio, но в классическом Rgui вам нужно щелкнуть консоль, чтобы она обновилась (увеличение спящего режима, например, на Sys.sleep(0.5) помогает это увидеть). Вы можете обойти это, используя flush.console, который очищает буфер:

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)

Ответ 2

Функция cat позволяет вам делать полезные сложные инструкции для отслеживания прогресса в вашем script

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