使用Rcpp构建包,未正确处理属性

Sco*_*hie 6 r rcpp rstudio

我一直在玩设置一个R包,目的是在RStudio中使用Rcpp,但是我很难通过Rcpp属性来正常工作.

我对它是如何工作的理解是相当脆弱的,但我的理解如下:

  1. 在源C++文件中,您可以添加Rcpp属性,例如标记// [[Rcpp::export]]标记用于导出的C++函数,使其可用于R.
  2. 当您构建包时,Rcpp然后在文件中生成相应的C++代码RcppExports.cpp,并在R源文件中生成包装函数RcppExports.R.

当我构建我的包时,这似乎没有正常工作(正如我所料).生成NAMESPACE文件时,Roxygen并没有很好地使用它(所以我禁用了它).标记// [[Rcpp::export]]似乎只标记导出到R的函数,而不是标记导出到包命名空间的函数.

更重要的是,Rcpp属性标记// [[Rcpp::depends()]]未正确处理.如果我将此处的代码复制到新的源文件中,并重建我的包,则会gccRcppExports.cpp文件上抛出错误,指出BigMatrix标识符未声明,表明属性tage // [[Rcpp::depends(bigmemory)]]未正确处理.

由于多件事情没有按照我的预期运作,我对Rcpp属性标签的理解缺少什么?

Rom*_*ois 4

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.