Plotting during a loop in RStudio

前端 未结 7 2110
无人及你
无人及你 2020-12-01 18:30

I am implementing a solution to the Traveling Salesman Problem (TSP) in R (simulated Annealing) and I want to output the current best path periodically. I have searched qui

相关标签:
7条回答
  • 2020-12-01 18:48

    Following up on @JoeCheng's answer and @RGuy's comment on that answer: as I worked out with the RStudio folks, the problem seems to primarily arise when there is too much plotting going on in too short a timespan. The solution is twofold:

    • Sys.sleep(0) helps force an update to the plotting window.
    • Plotting updates every Wth loop rather than every loop.

    For instance, on my computer (i7, RStudio Server), the following code does not update until the loop completes:

    N <- 1000
    x <- rep(NA,N)
    plot(c(0,1)~c(0,N), col=NA)
    for(i in seq(N)) {
      Sys.sleep(.01)
      x[i] <- runif(1)
      iseq <- seq(i-99,i)
      points( x[i]~i )
      Sys.sleep(0)
    }
    

    The following code updates in real-time, despite having the same number of points to be plotted:

    N <- 1000
    x <- rep(NA,N)
    plot(c(0,1)~c(0,N), col=NA)
    for(i in seq(N)) {
      Sys.sleep(.01)
      x[i] <- runif(1)
      iseq <- seq(i-99,i)
      if(i%%100==0) {
        points( x[iseq]~iseq )
        Sys.sleep(0)
      }
    }
    

    In other words, it's the number of calls the plot that seems to matter, not the amount of data to be plotted.

    0 讨论(0)
  • 2020-12-01 18:51

    Calling Sys.sleep(0) should cause the plot to draw. Unlike the X11 solution, this will work on server versions of RStudio as well.

    (I was surprised that dev.flush() did not give the result you were hoping for, that might be a bug.)

    0 讨论(0)
  • 2020-12-01 18:53

    One thing you can do is open a x11 window and plot in there:

    x11()
    Plotz()
    

    That should work the same as running it in terminal.

    0 讨论(0)
  • 2020-12-01 18:58

    If you want to save the plots as well you could just open a new device in the loop and close it afterwards.

    Plotz <- function(iter = 1000, interval = 100) {
      x <- 1:10
    
      p <- 0 #plot number
    
      for(i in 1:iter){
    
        y <- runif(10)
        if(i %% interval == 0) {
            png(file=paste(i,"png",sep="."))
            p <- p + 1; plot(x, y)
            dev.off()
        }
      }
    return(c(x, y))
    }
    
    0 讨论(0)
  • 2020-12-01 18:59

    You can use the animate package to layer your plots into a GIF.

    0 讨论(0)
  • 2020-12-01 19:07

    You can also use the back arrows on the plots tab of the lower left pane of the RStudio interface in order to view the plots.

    0 讨论(0)
提交回复
热议问题