2

Rcppに依存するRパッケージを作成しました。このパッケージの関数は、n回の反復ごとに印刷ステートメントを表示することになっています。したがって、Rコンソールに数秒ごとに新しい行が表示されることを期待しています。

奇妙なことに、R GUIで関数を実行すると、カーソルがロードホイールになり、Rが「ほぼ」フリーズします。計算が完了すると、ローディングホイールは消えます。

この状況の最小限の例は、次のように要約されます。

library(inline)
library(Rcpp)
test <- cxxfunction(
signature(),
body= '

RNGScope scope;
for (int i = 0; i < 100; i++)
{
sleep(1); // sleep one second at each iteration. this sleep is
// replaced by something in my code
if (i%20==0) Rprintf("\v%d iterations are done...",i);
}

return wrap(1);
' ,
plugin="Rcpp"
               )

test()// freeze for 100 seconds!

また、コードをターミナルで実行すると、予想どおり20秒ごとに新しい行が表示されることもわかりました。しかし、私はそれをRGUIで実行することを好みます。

なぜこれが起こっているのか誰かに教えてもらえれば幸いです。

私はMacを使用しています。

4

2 に答える 2

2

Rguiは出力をバッファリングします。私はRguiを使用していませんが、出力がバッファリングされるかどうかを制御する設定を見つけてみてください。Rコードの場合flush.console、出力を強制的に表示するために使用できますが、これがC++コードでどのように機能するかは完全にはわかりません。

于 2012-09-01T07:51:56.810 に答える
1

問題は、WindowsのRguiではなく、MacのR.appに関するものです。以下の解決策は私のために働きます:次のように、R_FlushConsoleとR_ProcessEventsでRprintfをフォローしてください:

RNGScope scope;
for (int i = 0; i < 100; i++) {
    sleep(1); // sleep one second at each iteration. this sleep is
              // replaced by something in my code
if (i%20==0) {
  Rprintf("\v%d iterations are done...\n",i);
  R_FlushConsole();
  R_ProcessEvents();
}

return wrap(1);
于 2013-02-25T23:40:22.833 に答える