我正在实施R(模拟退火)中的旅行商问题(TSP)的解决方案,我想定期输出当前的最佳路径.我已经搜索了很多关于如何在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()
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我看到的是最终的情节(在RStudio中).我怎样才能看到生成的图?
另外:我在Ubuntu上(无论最新的稳定版本是什么).不知道这是否相关.
提前谢谢大家.
编辑:根据Murphy上尉的建议,我尝试在Linux终端中运行它,并且出现了图形.我仍然想到"如何在RStudio中做到这一点?"的问题.然而,仍然是相关的.这是一个非常好的程序,所以也许有人知道如何才能让它发挥作用?
EDIT2:正如Thilo所说,这是Rstudio中的一个已知错误.如果有人在没有修复软件的情况下有任何其他想法来解决这个问题,那么还有一些事情需要讨论.否则,请考虑解决此问题.
Joe*_*eng 17
调用Sys.sleep(0)应该会绘制绘图.与X11解决方案不同,这也适用于RStudio的服务器版本.
(我很惊讶dev.flush()没有给出你希望的结果,这可能是一个错误.)
继续@ 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)
}
Run Code Online (Sandbox Code Playgroud)
以下代码实时更新,尽管要绘制的点数相同:
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)
}
}
Run Code Online (Sandbox Code Playgroud)
换句话说,它plot似乎是重要的调用次数,而不是要绘制的数据量.