2012-01-07 11 views
14

R(シミュレートアニーリング)でTraveling Salesman Problem(TSP)のソリューションを実装しており、現在の最適なパスを定期的に出力したいと考えています。私はforループ中にプロットを出力する方法をかなり調べて、これまでに失敗しました。RStudioのループ中にプロットする

私はRStudioを使用しており、生成されたグラフを見たいと思っています。 TSPソルバーが自分のことをやっているのを見たことがあるなら、あなたはそれがどれだけ素晴らしいかを理解するでしょう。ここに、私が見たいグラフィック出力のサンプルがあります。http://www.staff.science.uu.nl/~beuke106/anneal/anneal.html

私はメモリの使用が問題になるとは思わない(約50万回の反復中、私は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:Captain Murphyの提案では、これをLinux端末で実行しようとしましたが、グラフィックスが表示されました。私はまだ「RStudioでこれを行う方法」の問題を考えています。しかし、まだ関連しています。それはとても良いプログラムなので、誰かがこれを動作させるために何ができるのか考えているかもしれません。

EDIT2:Thiloが述べたように、これはRstudioの既知のバグです。ソフトウェア自体が修正されていなくても誰かがこれを解決するための他のアイデアを持っているなら、議論すべきことがまだあります。それ以外の場合は、この問題を解決してください。あなたが行うことができます

+1

標準Rコンソール(Rスタジオではありません)でコードをお試しください。反復的なプロットは私のためだけに終わりの1つではないようです。 –

+1

あなたはそれを見たかどうかはわかりませんが、RStudioのプロットパネルには前後の矢印があります。実際には、生成されたプロットをループするための素晴らしい方法です(私はしばらく気付かなかった) 。もちろん、プロットが生成されてもプロットは表示されませんが、その後は必要に応じてこれらのプロットをループすることができます。 –

+4

私は完全な答えはありませんが、おそらくいくつかの情報があります:これは2011年にRStudioのバグだったようです。http://support.rstudio.org/help/discussions/suggestions/214-プロットはリアルタイムで更新する必要があります。 – Thilo

答えて

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

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として、問題が短すぎるタイムスパンで起こってあまりにも多くのプロットがある場合には、主に発生しているようです。解決方法は2つあります:

  • Sys.sleep(0)プロットウィンドウを強制的に更新するのに役立ちます。
  • すべてのループではなく、W番目のループごとに更新をプロットします。リアルタイムで

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

    次のコードの更新を、それを有するにもかかわらず:ループが完了するまで

例えば、私のコンピュータ(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) 
    if(i%%100==0) { 
    points(x[iseq]~iseq) 
    Sys.sleep(0) 
    } 
} 

、それはデータの量をプロットすることが、重要ではないように思わ呼び出しplotの数です。

+1

私の問題は、TCL TKウィンドウにプロットしたいときです。私は私のウィンドウを更新する方法を見つけることができません。 私は 'Sys.sleep(0)'を実行しているときに更新していますが、タイトルバーを保持して移動することで(文字通り)ウィンドウを移動するまでは変更を見ることができません。 – David

0

animateパッケージを使用すると、プロットをGIFに重ねることができます。

関連する問題