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

时间:2013-08-26 06:55:23

标签: r rstudio rcpp

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

我对它如何运作的理解相当薄弱,但我的理解如下:

  1. 在源C ++文件中,您可以添加Rcpp属性,例如标记// [[Rcpp::export]]标记用于导出的C ++函数,使其可用于R。
  2. 当您构建包时,Rcpp然后在文件RcppExports.cpp中生成相应的C ++代码,并在R源文件RcppExports.R中生成包装函数。
  3. 当我构建我的包时,这似乎没有正常工作(正如我所料)。在生成NAMESPACE文件时,Roxygen并没有很好地使用它(所以我禁用了它)。标记// [[Rcpp::export]]似乎只标记导出到R的函数,而不是标记导出到包命名空间的函数。

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

    由于多项内容无法正常工作,我对Rcpp属性标记的理解缺少什么?

2 个答案:

答案 0 :(得分:4)

// [[Rcpp::export]]不会将函数导出到包NAMESPACE,它只是说“我们应该让这个函数可用于R” - 它仍然取决于你想要如何管理这个函数在你的命名空间。

Roxygen用于解析源文件注释中的roxygen标记;您必须在//' @export源文件中加入.cpp标记,如3.4 of the attributes vignette中所述。

对于第二个问题,您仍需要确保bigmemory文件的Depends:LinkingTo:部分中包含DESCRIPTION。我想有人可能更喜欢// [[Rcpp::depends]]来自动修改包DESCRIPTION文件,但这样做很容易。

在RStudio帮助委员会上也有类似的讨论here

答案 1 :(得分: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) ) ;   
}

这样您就可以捕获.cpp文件中的类型,而RcppExports.cpp只需知道SEXP