web-dev-qa-db-ja.com

RStudioでのループ中のプロット

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

これを実行すると、(RStudioで)作成された最終的なプロットだけが表示されます。生成されたプロットをどのように確認できますか?

また:私はUbuntuを使用しています(最新の安定版リリースが何であれ)。それが適切かどうかわからない。

よろしくお願いします。

編集:キャプテンマーフィーの提案に従って、私はこれをLinuxターミナルで実行しようとしましたが、グラフィックが表示されました。私はまだ「RStudioでこれを行う方法」の質問を考えています。ただし、それでも関連性があります。それはとても良いプログラムなので、誰かがこれを機能させるために何ができるかについての考えを持っているかもしれませんか?

EDIT2:Thiloが述べたように、これはRstudioの既知のバグです。ソフトウェア自体を修正せずにこれを解決するための他のアイデアがある場合は、まだ議論することがあります。それ以外の場合は、この質問が解決されたと考えてください。

16
Rguy

できることの1つは、x11ウィンドウを開いてそこにプロットすることです。

x11()
Plotz()

これは、ターミナルで実行するのと同じように機能するはずです。

8
Sacha Epskamp

Sys.sleep(0)を呼び出すと、プロットが描画されます。 _X11_ソリューションとは異なり、これはサーバーバージョンのRStudioでも機能します。

dev.flush()が期待した結果をもたらさなかったことに驚きました。これは、バグである可能性があります。)

17
Joe Cheng

@JoeChengの回答とその回答に対する@RGuyのコメントのフォローアップ:私が RStudioの人々と協力して のように、問題は主に、短すぎる期間で行われているプロットが多すぎる場合に発生するようです。解決策は2つあります。

  • Sys.sleep(0)は、プロットウィンドウを強制的に更新するのに役立ちます。
  • プロットは、すべてのループではなく、すべてのWthループを更新します。

たとえば、私のコンピューター(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
Ari B. Friedman

プロットも保存したい場合は、ループ内の新しいデバイスを開いて、後で閉じることができます。

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))
}
2
Markus Graf
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インターフェイスの左下ペインの[プロット]タブにある戻る矢印を使用することもできます。

1

アニメーションパッケージを使用して、プロットをGIFに重ねることができます。

0
Peter Prevos