R Markdown中宏‘RcppExport’展开引发C++语法错误的解决咨询
错误原因与解决方法
错误根源
使用R Markdown的Rcpp代码块通过file参数导入外部cpp文件时,rmarkdown的代码处理逻辑与Rcpp::sourceCpp()的原生处理存在差异:rmarkdown自动生成的包装代码会与原文件中// [[Rcpp::export]]标记的函数产生冲突,导致RcppExport宏展开后的extern "C"语法被编译器误判,同时引发代码结构层面的括号匹配错误。而直接使用Rcpp::sourceCpp()时,Rcpp内部能正确生成合法的包装代码,因此编译正常。
解决方法
方法1:将cpp代码直接嵌入Rcpp块
删除file参数,把resid.cpp的完整代码复制到R Markdown的Rcpp代码块中:
#include <Rcpp.h> #include <RcppEigen.h> using Eigen::Map; using Eigen::EigenBase; using Eigen::HouseholderQR; using Eigen::MatrixXd; using Eigen::SparseMatrix; using Eigen::SparseQR; using Eigen::COLAMDOrdering; // [[Rcpp::depends(RcppEigen)]] // [[Rcpp::export]] SEXP qr_dense_residop(Map<MatrixXd> X, Map<MatrixXd> Y){ const HouseholderQR<MatrixXd> QR(X); return Rcpp::wrap(Y - (X * QR.solve(Y))); } // [[Rcpp::export]] SEXP qr_sparse_residop(Map<SparseMatrix<double>> X, Map<SparseMatrix<double>> Y){ const SparseQR<SparseMatrix<double>, COLAMDOrdering<int>> QR(X); return Rcpp::wrap(Y - (X * QR.solve(Y))); }
方法2:在R代码块中调用Rcpp::sourceCpp()
改用普通R代码块,直接调用Rcpp::sourceCpp()编译外部文件,完全复用原生编译逻辑:
Rcpp::sourceCpp("resid.cpp")
内容的提问来源于stack exchange,提问作者Migwell
相关产品推荐
相关产品推荐

