2013-08-26 10 views
6

RStudioでRcppを使用することを目的としたRパッケージをセットアップしていましたが、Rcpp属性で正しく動作するように苦労しています。Rcppでパッケージをビルドすると、属性が正しく処理されない

これがどのように動作するかの私の理解はかなり希薄であるが、次のように私の理解である:ソースC++ファイルで

  1. 、あなたはRcppタグ// [[Rcpp::export]]をエクスポートするためのC++の機能をマークし、たとえば、属性を追加することができますRのためにそれを利用可能にする
  2. パッケージをビルドするとき、RcppはファイルRcppExports.cppに適切なC++コードを生成し、RソースファイルRcppExports.Rにラッパー関数を生成します。
私のパッケージをビルドするとき、これは(期待通りに)うまく動作していないようです。 RoxygenはNAMESPACEファイルを生成するときにうまくいきません(無効にしました)。タグ // [[Rcpp::export]]は、パッケージの名前空間にエクスポートするための関数をマークするのではなく、Rにエクスポートするための関数にマークするだけです。

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

Rcppの属性タグの理解に何が欠けていますか?

+0

Rcpp属性とその 'compileAttributes()'ヘルパーに頼るのではなく、関数インタフェースを手で書くだけでよいのです。結局のところ、特別な場合があります(特別なヘッダーが必要です)。 –

答えて

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を知っていなければならないようにするため。

4

// [[Rcpp::export]]は、NAMESPACEというパッケージに関数をエクスポートしていないだけで、「この関数をRに利用できるようにする必要があります」と言います。ネームスペースでこの関数をどのように管理するかはあなた次第です。

Roxygenはソースファイルのコメントからroxygenタグを解析します。部分的に3.4 of the attributes vignetteで記述されているように、.cppのソースファイルに//' @exportタグを含める必要があります。

2番目の問題については、bigmemoryがファイルのDepends:LinkingTo:セクションにあることを確認する必要があります。私は// [[Rcpp::depends]]が自動的にパッケージDESCRIPTIONファイルを修正することを好むかもしれないと思うが、あなた自身で行うのは簡単だ。

RStudioヘルプボードにも同様の説明があります。here

+0

ありがとう、それは 'NAMESPACE'ファイルの私の問題を解決し、Roxygenの知識のいくつかのギャップを説明しました! '@useDynLib bigmemory'を追加しても問題は解決されません。私は 'bigmemory'を' DESCRIPTION'ファイルの依存関係とリンクの両方としてリストアップしました。 –

関連する問題