首页 > 解决方案 > 犰狳的 print() 方法和 cout 从 Rcpp 调用时的顺序不一致

问题描述

最近,我一直在使用RcppArmadillo,但我注意到某些对象的打印顺序有些不一致。特别是在使用coutand时print()。有时,print()会先打印,然后cout;其他时候则相反。

我不明白为什么会这样。我想coutprint()被异步调用,因此顺序不同,但为什么会发生这种情况?以及如何预防?

例子

如果我有以下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

标签: c++rrcpparmadillorcpparmadillo

解决方案


根据RolandDirk的评论,以及Dirk 的书这篇 Rcpp 文章,解决方案是使用andRcout代替。coutprint()

根据德克的书

因为 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;
}

推荐阅读