6

我一直在尝试设置一个旨在在 RStudio 中使用 Rcpp 的 R 包,但我正在努力让 Rcpp 属性正常工作。

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

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

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

// [[Rcpp::depends()]]更重要的是,没有正确处理Rcpp Attribute 标签。如果我将此处的代码复制到一个新的源文件中,并重新构建我的包,则会在文件gcc上引发错误,指出标识符未声明,表明属性标记未正确处理。RcppExports.cppBigMatrix// [[Rcpp::depends(bigmemory)]]

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

4

2 回答 2

4

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

Roxygen 用于从源文件注释中解析 roxygen 标签;您必须在源文件中包含一个//' @export标签,如属性 vignette 的 3.4部分所述。.cpp

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

RStudio 帮助板上也有类似的讨论

于 2013-08-26T07:23:28.293 回答
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.

于 2013-08-26T08:30:36.283 回答