Построение во время цикла в RStudio - PullRequest
15 голосов
/ 08 января 2012

Я внедряю решение задачи коммивояжера (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 (какой бы ни была самая новая стабильная версия). Не знаю, имеет ли это отношение.

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

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

РЕДАКТИРОВАТЬ 2: Как сказал Тило, это известная ошибка в Rstudio. Если у кого-то есть другие идеи, чтобы решить эту проблему без исправления самого программного обеспечения, то есть еще что обсудить. В противном случае считаю этот вопрос решенным.

Ответы [ 7 ]

17 голосов
/ 11 января 2012

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

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

8 голосов
/ 31 октября 2012

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

  • Sys.sleep(0) помогает принудительно обновить окно печати. ​​
  • График обновлений каждый W-й цикл, а не каждый цикл.

Например, на моем компьютере (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 имеет значение, а не количество данных, которые будут отображаться.

8 голосов
/ 08 января 2012

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

x11()
Plotz()

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

2 голосов
/ 24 апреля 2012

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

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))
}
1 голос
/ 09 января 2012

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

1 голос
/ 09 января 2012
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()
0 голосов
/ 11 апреля 2017

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

...