6

RStudio で Rcpp を使用することを目的とした R パッケージのセットアップをいじっていますが、Rcpp 属性で適切に機能させるのに苦労しています。

これがどのように機能するかについての私の理解はかなり薄いですが、私の理解は次のとおりです。

  1. ソース C++ ファイルでは、Rcpp 属性を追加できます。たとえば、タグ// [[Rcpp::export]]はエクスポート用の C++ 関数をマークし、R で使用できるようにします。
  2. Build the package を実行Rcppすると、適切な C++ コードがファイルRcppExports.cppに生成され、ラッパー関数が R ソース ファイルに生成されますRcppExports.R

パッケージをビルドするとき、これは (予想どおり) 適切に機能していないようです。Roxygen は、NAMESPACE ファイルを生成するときにこれをうまく処理できません (そのため、無効にしました)。このタグ// [[Rcpp::export]]は、パッケージの名前空間にエクスポートする関数をマークするのではなく、R にエクスポートする関数をマークするだけのようです。

さらに重要なのは、Rcpp 属性タグ// [[Rcpp::depends()]]が正しく処理されていないことです。ここのコードを新しいソース ファイルにコピーしてパッケージを再ビルドすると、識別子が宣言されていないことを示すgccエラーがRcppExports.cppファイルにスローBigMatrixされ、属性タグ// [[Rcpp::depends(bigmemory)]]が正しく処理されていないことが示されます。

複数のことが期待どおりに機能しないため、Rcpp 属性タグの理解に欠けているものは何ですか?

4

2 に答える 2

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 に答える