RcppEigen #define 在使用 sourceCpp() 时有效,但在 R CMD build 中被忽略

RcppEigen #define works when using sourceCpp() but ignored with R CMD build

我注意到 sourceCpp() 尊重 C++ #definedevtools::document()R CMD build 似乎忽略了它们,至少在本征矩阵初始化的情况下是这样。

考虑这个 .cpp 文件:

#define EIGEN_INITIALIZE_MATRICES_BY_ZERO

//[[Rcpp::depends(RcppEigen)]]
#include <RcppEigen.h>

//[[Rcpp::export]]
Eigen::MatrixXd initialize_matrix(int nrow, int ncol) {
  return Eigen::MatrixXd(nrow, ncol);
}

可以使用 sourceCpp 获取此文件,然后 运行 R 中的以下内容:

> initialize_matrix(5, 3)
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0
[4,]    0    0    0
[5,]    0    0    0

太好了,矩阵已用零初始化!

现在将相同的 .cpp 文件放入 RcppEigen 包中并使用 devtools::document()R CMD build.

进行编译
> initialize_matrix(5, 3)
              [,1]          [,2]          [,3]
[1,] 1.845608e-317 9.881313e-324 9.881313e-324
[2,] 1.107517e-311  0.000000e+00  0.000000e+00
[3,] 9.881313e-324  0.000000e+00  0.000000e+00
[4,]  0.000000e+00 2.121963e-314 9.881313e-324
[5,]  0.000000e+00 1.107517e-311  0.000000e+00

矩阵没有用零初始化,而是看起来像 memset。

为什么 sourceCpp() 尊重 pragma 声明而 devtools::document() 在编译期间忽略它?

我认为,要在包中使用,您需要将 -DEIGEN_INITIALIZE_MATRICES_BY_ZERO 添加到 src/Makevars, 例如如 https://github.com/privefl/bigstatsr/blob/master/src/Makevars#L2(那里有 2 个犰狳标志)。

或者只是顺序问题?尝试将 #define 放在 #include <RcppEigen.h> 之后。