c++ - 犰狳的 print() 方法和 cout 从 Rcpp 调用时的顺序不一致
问题描述
最近,我一直在使用RcppArmadillo
,但我注意到某些对象的打印顺序有些不一致。特别是在使用cout
and时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
解决方案
根据Roland和Dirk的评论,以及Dirk 的书和这篇 Rcpp 文章,解决方案是使用andRcout
代替。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;
}
推荐阅读
- python - 欧几里得算法 - 我在做什么?蟒蛇约翰泽尔
- flutter - 如何在 Flutter 中使用 PopupMenu Item 设置分隔符和分隔符颜色?
- typescript - 这里的某个地方是一个递归调用,我似乎找不到它。我必须使用 Typescript 和 Lodash 而不是 SuiteScript
- html - jQuery .wrap() 相邻按钮 HTML
- google-api - GCM 360:使用 python 代码验证从 GCM 360 下载的服务密钥 json 文件
- python - 编写对可变维度数组具有弹性的函数
- python - Keras 符号输入/输出不实现 `op`
- ffmpeg - 无法在 VLC 中播放 m3u8 文件或使用 ffmpeg 解密
- python - 如何确保保留此订单
- zabbix - 报告生成测试失败