17

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の既知のバグです。ソフトウェア自体を修正せずにこれを解決するための他のアイデアが誰かにある場合は、まだ議論することがあります。それ以外の場合は、この質問が解決したと考えてください。

4

7 に答える 7

17

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

dev.flush()(私はあなたが期待した結果をもたらさなかったことに驚きました、それはバグかもしれません。)

于 2012-01-11T02:14:46.953 に答える
8

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

x11()
Plotz()

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

于 2012-01-08T11:58:23.120 に答える
8

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

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

プロットするポイントの数が同じであるにもかかわらず、次のコードはリアルタイムで更新されます。

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プロットされるデータの量ではなく、重要と思われる呼び出しの数です。

于 2012-10-31T13:58:34.457 に答える
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))
}
于 2012-04-24T09:38:17.547 に答える
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()
于 2012-01-09T15:29:27.460 に答える
1

プロットを表示するために、RStudioインターフェイスの左下のペインの[プロット]タブにある戻る矢印を使用することもできます。

于 2012-01-09T15:49:41.163 に答える
0

アニメーションパッケージを使用して、プロットをGIFにレイヤー化できます。

于 2017-04-11T10:42:50.923 に答える