How do I print a variable inside a for loop to the console in real time, as the loop is running, in R?

后端 未结 2 1714
眼角桃花
眼角桃花 2021-01-04 02:01

I have a loop that takes a long time for each iteration, and I would like to see the progress of it in real time. How do I print a variable inside a for loop to the console

相关标签:
2条回答
  • 2021-01-04 02:37

    The cat() function allows you to make useful complex statements to keep track of progress in your 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
    
    0 讨论(0)
  • 2021-01-04 02:48

    The last one does print in real time, try it like this:

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

    This looks fine in Rstudio, but in classic Rgui you have to click the console in order to it to refresh (increasing the sleep for example by Sys.sleep(0.5) helps to see that). You can circumvent that by using flush.console which clears the buffer:

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

    Or in Windows you can select Misc in the upper toolbar and uncheck the buffered output.


    If your goal is to track the process of your loop, the above method feels bit akward (at least to my eyes) when you are running through large number of iterations. In that case it might be nicer to use progress bars:

    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)
    

    Or something even nicer:

    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)
    
    0 讨论(0)
提交回复
热议问题