我一直在玩设置一个R包,目的是在RStudio中使用Rcpp,但是我很难通过Rcpp属性来正常工作.
我对它是如何工作的理解是相当脆弱的,但我的理解如下:
// [[Rcpp::export]]标记用于导出的C++函数,使其可用于R.Rcpp然后在文件中生成相应的C++代码RcppExports.cpp,并在R源文件中生成包装函数RcppExports.R.当我构建我的包时,这似乎没有正常工作(正如我所料).生成NAMESPACE文件时,Roxygen并没有很好地使用它(所以我禁用了它).标记// [[Rcpp::export]]似乎只标记导出到R的函数,而不是标记导出到包命名空间的函数.
更重要的是,Rcpp属性标记// [[Rcpp::depends()]]未正确处理.如果我将此处的代码复制到新的源文件中,并重建我的包,则会gcc在RcppExports.cpp文件上抛出错误,指出BigMatrix标识符未声明,表明属性tage // [[Rcpp::depends(bigmemory)]]未正确处理.
由于多件事情没有按照我的预期运作,我对Rcpp属性标签的理解缺少什么?
RcppExports.cpp这是生成的文件的问题。目前,没有办法教它包含其他地方的头文件,所以它只是不包含bigmemory/MatrixAccessor.hpp.
解决方法是执行以下操作:
#include <Rcpp.h>
#include <bigmemory/MatrixAccessor.hpp>
Rcpp::NumericVector BigColSums(Rcpp::XPtr<BigMatrix> pBigMat) {
// Create the matrix accessor so we can get at the elements of the matrix.
MatrixAccessor<double> ma(*pBigMat);
// Create the vector we'll store the column sums in.
Rcpp::NumericVector colSums(pBigMat->ncol());
for (size_t i=0; i < pBigMat->ncol(); ++i)
colSums[i] = std::accumulate(ma[i], ma[i]+pBigMat->nrow(), 0.0);
return colSums;
}
// [[Rcpp::export]]
Rcpp::NumericVector BigColSums( SEXP pBigMat ){
return BigColSums( Rcpp::XPtr<BigMatrix>( pBigMat) ) ;
}
Run Code Online (Sandbox Code Playgroud)
这样您就可以捕获文件中的类型.cpp并且RcppExports.cpp只需要了解SEXP.