Ответ 1
Одна вещь, которую вы можете сделать, - открыть окно x11 и график:
x11()
Plotz()
Это должно работать так же, как запускать его в терминале.
Я реализую решение проблемы командирующего продавца (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. Если у кого-то есть другие идеи для решения этой проблемы, если само программное обеспечение не будет исправлено, то есть еще что-то обсудить. В противном случае рассмотрим этот вопрос.
Одна вещь, которую вы можете сделать, - открыть окно x11 и график:
x11()
Plotz()
Это должно работать так же, как запускать его в терминале.
Вызов Sys.sleep(0) должен вызвать рисование графика. В отличие от решения X11, это также будет работать на серверных версиях RStudio.
(Я был удивлен, что dev.flush() не дал результат, на который вы надеялись, это может быть ошибка.)
В ответ на ответ @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
, которое, по-видимому, имеет значение, а не объем данных, которые должны быть построены.
Если вы хотите сохранить графики, вы можете просто открыть новое устройство в цикле и закрыть его позже.
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))
}
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()
Вы также можете использовать обратные стрелки на вкладке графика в нижней левой панели интерфейса RStudio для просмотра графиков.
Вы можете использовать пакет animate для выравнивания ваших графиков в GIF.