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 秒出现一次。但我更喜欢在 R GUI 上运行它。

如果有人能告诉我为什么会这样,我将不胜感激。

我正在使用 Mac。

4

2 回答 2

2

Rgui 缓冲输出。我不使用 Rgui,但尝试找到控制输出是否缓冲的设置。对于 R 代码,您可以使用它flush.console来强制显示输出,但我不完全确定这将如何与 C++ 代码一起使用。

于 2012-09-01T07:51:56.810 回答
1

问题是关于 Mac 上的 R.app,而不是 Windows 上的 Rgui。下面的解决方案对我有用:使用 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 回答