Построение графика во время цикла в RStudio

Я реализую решение проблемы командирующего продавца (TSP) в R (имитированное отжиг), и я хочу периодически выводить текущий лучший путь. Я довольно много искал, как выводить графики в цикле for и до сих пор не удалось.

Я использую RStudio и хочу видеть графики по мере их создания. Если вы когда-либо смотрели, как решатели TSP делают свое дело, вы поймете, как здорово смотреть. Вот пример графического вывода, который я хочу видеть http://www.staff.science.uu.nl/~beuke106/anneal/anneal.html

Я не думаю, что использование памяти будет проблемой (в течение примерно 500 000 итераций я ожидаю только 50-100 графиков). Вот примерная функция, где мы ожидаем увидеть 10 разных графиков за время выполнения функции:

Plotz <- function(iter = 1000000, interval = 100000) {
  x <- 1:10
  for(i in 1:iter){
    y <- runif(10)
    if(i %% interval == 0) {
      plot(x, y)
    }
  }
  return(c(x, y))
}
Plotz()

Когда я запускаю это, все, что я вижу, это заключительный сюжет, созданный (в RStudio). Как я могу увидеть графики по мере их создания?

Также: я на Ubuntu (независимо от новейшей стабильной версии). Не знаю, насколько это важно.

Спасибо всем заблаговременно.

EDIT: По предложению капитана Мерфи я попытался запустить это в терминале Linux, и появилась графика. Я все еще думаю о проблеме "Как это сделать в RStudio?" Однако все еще актуально. Это такая хорошая программа, поэтому, возможно, у кого-то есть представление о том, что можно сделать, чтобы заставить это работать?

EDIT2: Как заявил Тило, это известная ошибка в Rstudio. Если у кого-то есть другие идеи для решения этой проблемы, если само программное обеспечение не будет исправлено, то есть еще что-то обсудить. В противном случае рассмотрим этот вопрос.

Ответы

Ответ 1

Одна вещь, которую вы можете сделать, - открыть окно x11 и график:

x11()
Plotz()

Это должно работать так же, как запускать его в терминале.

Ответ 2

Вызов Sys.sleep(0) должен вызвать рисование графика. В отличие от решения X11, это также будет работать на серверных версиях RStudio.

(Я был удивлен, что dev.flush() не дал результат, на который вы надеялись, это может быть ошибка.)

Ответ 3

В ответ на ответ @JoeCheng и комментарий @RGuy на этот ответ: поскольку я работал с людьми RStudio, проблема, по-видимому, в первую очередь возникают, когда слишком много заговора происходит слишком коротко. Решение двоякое:

  • Sys.sleep(0) помогает принудительно обновить окно построения.
  • Планирование обновляет каждый цикл W th, а не каждый цикл.

Например, на моем компьютере (i7, RStudio Server) следующий код не обновляется до тех пор, пока цикл не завершится:

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)
}

Следующие обновления кода в режиме реального времени, несмотря на то, что они имеют одинаковое количество точек:

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)
  }
}

Другими словами, это число вызовов plot, которое, по-видимому, имеет значение, а не объем данных, которые должны быть построены.

Ответ 4

Если вы хотите сохранить графики, вы можете просто открыть новое устройство в цикле и закрыть его позже.

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))
}

Ответ 5

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) {
        p <- p + 1; plot(x, y)
        readline("Please press the Enter key to see the next plot if there is one.")
    }
  }
  return(c(x, y))
}
Plotz()

Ответ 6

Вы также можете использовать обратные стрелки на вкладке графика в нижней левой панели интерфейса RStudio для просмотра графиков.

Ответ 7

Вы можете использовать пакет animate для выравнивания ваших графиков в GIF.