Rcpp: Mac показывает колесо загрузки и почти зависает

Я создал пакет R, который зависит от Rcpp. Функция в этом пакете должна отображать операторы печати на каждых n итерациях. Поэтому я ожидаю увидеть новую строку в консоли R каждые несколько секунд.

Странно то, что когда я запускаю свою функцию в графическом интерфейсе R, курсор становится загрузочным колесом, и 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.


person FairyOnIce    schedule 01.09.2012    source источник


Ответы (2)


Вопрос касается R.app на Mac, а не Rgui на Windows. Решение ниже работает для меня: следуйте Rprintf с R_FlushConsole и R_ProcessEvents, например:

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);
person Davor Cubranic    schedule 25.02.2013

Rgui буферизует вывод. Я не использую Rgui, но постараюсь найти настройку, которая определяет, буферизуется вывод или нет. Для кода R вы можете использовать flush.console для принудительного отображения вывода, но я не совсем уверен, как это будет работать с кодом C++.

person Paul Hiemstra    schedule 01.09.2012
comment
+1 - это почти не имеет ничего общего с Rcpp и касается только Rgui в Windows, где, если мне не изменяет память, у вас есть переключатель конфигурации для отмены буферизации. - person Dirk Eddelbuettel; 01.09.2012