2012-01-07 246 views
14

我正在實施R(模擬退火)中的旅行推銷員問題(TSP)的解決方案,我想定期輸出當前最佳路徑。我已經搜索了很多關於如何在for循環中輸出圖的方法,並且迄今爲止失敗了。在RStudio循環中繪圖

我使用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中執行此操作?」的問題?但是,仍然有關。這是一個很好的計劃,所以也許有人有一個想法,可以做些什麼來實現這個目標?

EDIT2:正如Thilo所說,這是Rstudio中的一個已知錯誤。如果任何人有任何其他想法來解決這個問題,而軟件本身沒有被修復,那麼還有什麼可以討論的。否則,請考慮解決這個問題。

+1

在標準R控制檯(而不是R工作室)試試你的代碼。迭代情節似乎出現在我身上,而不僅僅是結尾。 – 2012-01-07 20:08:00

+1

我不知道你是否看到過,但是在RStudio的繪圖面板中有來回箭頭,這實際上是一種很好的方式讓你循環生成的繪圖(我沒有注意到它們一段時間) 。當然,你並沒有看到它們產生的情節,但是在那之後,你可以隨意循環這些情節。 – 2012-01-07 20:20:46

+4

我沒有給你一個完整的答案,但也許有一些信息:看起來這是(是?)2011年RStudio中的一個錯誤。請參閱http://support.rstudio.org/help/discussions/suggestions/214-地塊 - 應該更新在實時-OSX – Thilo 2012-01-07 20:36:03

回答

8

一兩件事你可以做的是在那裏打開一個窗口,X11和情節:

x11() 
Plotz() 

這應該工作一樣端子運行它。

1
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() 
1

您還可以使用RStudio界面左下方窗格的繪圖選項卡上的後退箭頭查看繪圖。

16

調用Sys.sleep(0)會導致繪圖。與X11解決方案不同,這也適用於服務器版本的RStudio。

(我感到驚訝的是dev.flush()不給你所希望看到的結果,這可能是一個錯誤。)

+1

這也是一個很好的解決方案。這個和@Sacha的區別在於,如果我們在短時間內生成很多地塊,那麼這個(至少在我的系統上)並不總是顯示所有的地塊,如果它們生成得太快。這不一定是壞事,這取決於你是否想要看到所有的情節,或者你的目標只是對TSP系統的當前狀態有一個總體的瞭解。就我的目的而言,x11()解決方案效果更好,但這也是一個很好的解決方案。 – Rguy 2012-01-11 20:56:40

2

如果你想保存的田塊,以及你可以只打開一個新的設備在循環中,然後關閉它。

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

上@ JoeCheng的答案,@上回答RGuy的評論跟進:我worked out with the RStudio folks,這個問題似乎時有太多的繪圖在太短的時間跨度去上主要出現。解決方案有兩個:

  • Sys.sleep(0)有助於強制更新繪圖窗口。
  • 繪製更新每個W th循環,而不是每個循環。

舉例來說,在我的電腦(I7,RStudio服務器)上,下面的代碼不會更新,直到循環完成:實時

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的數量,而不是要繪製的數據量。

+1

當我想在TCL TK窗口中繪圖時,我的問題是什麼?我無法找到更新窗口的方法。 當我做'Sys.sleep(0)',它正在更新,但我看不到變化,直到我通過按住並移動標題欄來移動(字面上)該窗口。 – David 2013-08-20 10:05:25

0

您可以使用animate包將您的圖形疊加到GIF中。