Метод Arduillo print () и cout несовместимы по порядку при вызове из Rcpp - PullRequest
3 голосов
/ 05 февраля 2020

В последнее время я использую RcppArmadillo, но я заметил некоторые несоответствия в порядке печати определенных объектов. В частности, при использовании cout и print(). Иногда сначала печатается print(), затем cout; а в другие времена все наоборот.

Я не понимаю точно, почему это происходит. Я полагаю, что cout и print() называются асинхронно и, следовательно, разница в порядке, но почему это происходит? И как это можно предотвратить?

Пример

Если у меня есть следующий test_order.cpp файл

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;
using namespace arma;


// [[Rcpp::export]]
int test(int n){

  cout << "Print 1\n";
  arma::mat X(n, n);
  cout << "Print 2\n";
  X.print();
  cout << "Print 3\n";

  return 1;

}

И вызвать его из R следующим образом:

library(Rcpp)

sourceCpp("test_order.cpp")

test(3)

При печати я получаю разные результаты. Три различных результата следующие:

> test(3)
  2.1220e-314            0  6.9531e-310Print 1
Print 2

  2.3044e-314  6.9275e-310  6.9532e-310
  2.1916e-314  2.1916e-314  2.2718e-314
Print 3
[1] 1
> test(3)
  Print 1
Print 2
6.9531e-310  2.3044e-314  4.9407e-324
  6.9532e-310  2.1916e-314  4.9407e-324
            0  6.9275e-310  4.9407e-324
Print 3
[1] 1

> test(3)
  6.9531e-310  2.3044e-314  4.9407e-324
  6.9532e-310  2.1916e-314  4.9407e-324
            0  6.9275e-310  4.9407e-324Print 1
Print 2

[1]Print 3
 1

1 Ответ

2 голосов
/ 11 февраля 2020

На основе Роланда и Дирка комментариев, а также Дирка и этой статьи R cpp решение состоит в том, чтобы использовать Rcout вместо cout и print().

Согласно книге Дирка :

Поскольку R обеспечивает « Оболочка »вокруг наших статистических вычислений, программы должны синхронизировать свои (печатные) выходные данные с R, который использует свою собственную буферизацию.

Кроме того, код флага сопровождающих CRAN, который включает std::cout.

Итак, файл test_order.cpp должен быть таким:

#include <RcppArmadillo.h>

// [[Rcpp::depends(RcppArmadillo)]]

using namespace Rcpp;
using namespace arma;


// [[Rcpp::export]]
int test(int n){
    Rcout << "Print 1\n";
    arma::mat X(n, n);
    Rcout << "Print 2\n";
    Rcout << X << "\n";
    Rcout << "Print 3\n";

    return 1;
}
...