我一直在玩设置一个R软件包,目的是在RStudio中使用Rcpp,但是我很难通过Rcpp属性来正常工作。
我对它如何运作的理解相当薄弱,但我的理解如下:
// [[Rcpp::export]]
标记用于导出的C ++函数,使其可用于R。Rcpp
然后在文件RcppExports.cpp
中生成相应的C ++代码,并在R源文件RcppExports.R
中生成包装函数。当我构建我的包时,这似乎没有正常工作(正如我所料)。在生成NAMESPACE文件时,Roxygen并没有很好地使用它(所以我禁用了它)。标记// [[Rcpp::export]]
似乎只标记导出到R的函数,而不是标记导出到包命名空间的函数。
更重要的是,Rcpp属性标记// [[Rcpp::depends()]]
未正确处理。如果我将代码here复制到新的源文件中,并重建我的包,gcc
会在RcppExports.cpp
文件上抛出错误,说明BigMatrix
标识符未声明,表明属性tage // [[Rcpp::depends(bigmemory)]]
未正确处理。
由于多项内容无法正常工作,我对Rcpp属性标记的理解缺少什么?
答案 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
。