【发布时间】:2021-09-12 13:20:08
【问题描述】:
我正在尝试使用执行某些线性回归的 R 4.1.0 构建一个 R 包 (RegressionTool)。为了加快矩阵乘法,我想在 .cpp 脚本中外包矩阵乘法运算,我想将其包含在我的最终 R 包中。 我想用于矩阵乘法的脚本 Cmatmult.cpp 如下所示:
#include <RcppArmadillo.h>
#include <RcppEigen.h>
// Correctly setup the build environment
// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::depends(RcppEigen)]]
using namespace Rcpp;
using namespace arma;
using namespace Eigen;
// [[Rcpp::export]]
SEXP armaMatMult(arma::mat A, arma::mat B){
arma::mat C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMatMult(Eigen::MatrixXd A, Eigen::MatrixXd B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
// [[Rcpp::export]]
SEXP eigenMapMatMult(const Eigen::Map<Eigen::MatrixXd> A, Eigen::Map<Eigen::MatrixXd> B){
Eigen::MatrixXd C = A * B;
return Rcpp::wrap(C);
}
在 RegressionTool 文件夹中,除了包含 R6 类的文件夹 R 之外,还有文件 DESCRIPTION 和 NAMESPACE ,我保存了包含文件 Cmatmult.cpp 的文件夹 src。为了尝试编译包,我在 R 控制台中运行以下命令:
RcppArmadillo::RcppArmadillo.package.skeleton("RegressionTool")
Rcpp::compileAttributes()
roxygen2::roxygenize(roclets="rd")
我注意到生成子文件夹RegressionTool 的RcppArmadillo.package.skeleton() 命令不会生成任何Makevars/Makevars.win 文件。虽然前两个命令运行没有错误,但最后一个命令停止并出现以下错误:
C:/Program Files/R/R-4.1.0/library/RcppArmadillo/include/armadillo_bits/translate_blas.hpp:88: undefined reference to `dsyrk_'
collect2.exe: error: ld returned 1 exit status
no DLL was created
ERROR: compilation failed for package 'RegressionTool'
我已经将 Rcpp 和 RcppArmadillo 的 LinkingTo: 和 Depends: 包含在存储在文件夹 RegressionTool 中的说明文件中,但我仍然不明白为什么要使用 Makevars/Makevars。 win 文件没有生成(这是否是roxygenize 出错的原因)。
【问题讨论】:
标签: c++ r rcpp r6 rcpparmadillo