14

現在、.cppを使用してコンパイルできるファイルがありますsourceCpp()。期待どおり、対応する R 関数が作成され、コードは期待どおりに機能します。

ここにあります:

#include <Rcpp.h> 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector exampleOne(NumericVector vectorOne, NumericVector vectorTwo){

    NumericVector outputVector = vectorOne + vectorTwo; 

    return outputVector;
}

現在、プロジェクトを を使用してパッケージに変換していますRcpp。そこで、rStudio でスケルトンを作成し、変換する方法を検討し始めました。

Cpp に関するHadley の優れた入門書の中で、彼はセクション「Using Rcpp in a Package」で次のように述べています。

パッケージが Rcpp::export 属性を使用している場合、パッケージ ビルド プロセスで 1 つの追加手順が必要になります。compileAttributes 関数は、パッケージ内のソース ファイルをスキャンして Rcpp::export 属性を探し、関数を R にエクスポートするために必要なコードを生成します。

関数が追加、削除、または署名が変更されたときはいつでも、compileAttributes を再実行する必要があります。RStudio または devtools を使用してパッケージをビルドする場合、この手順は自動的に行われることに注意してください。

したがって、でコンパイルされたコードsourceCpp()は、パッケージ内とほぼ同じように機能するはずです。

対応する R ファイルを作成しました。

exampleOne <- function(vectorOne, vectorTwo){
    outToR <- .Call("exampleOne", vectorOne, vectorTwo, PACKAGE ="testPackage")
    outToR
}

次に、パッケージを (再) ビルドすると、次のエラーが発生します。

Error in .Call("exampleOne", vectorOne, vectorTwo, PACKAGE = "voteR") : C symbol name "exampleOne" not in DLL for package "testPackage"

sourceCpp() でコンパイルしてパッケージで使用するコードを取得するときに他に何をする必要があるかについて、誰かが考えを持っていますか?

「Rcpp を使用するパッケージの作成」 http://cran.rstudio.com/web/packages/Rcpp/vignettes/Rcpp-package.pdfを読み、そこに示されている基本構造を理解していることに注意してください。ただし、RcppExamplesソース コードを確認すると、ビネットの構造はサンプル パッケージで使用されているものとまったく同じではないようです。たとえば、使用される .h ファイルはありません。また、ビネットもソース コードも [[Rcpp::export]] 属性を使用しません。これにより、エラーがどこにあるかを正確に追跡することが難しくなります。

4

3 に答える 3

10

これは、sourceCpp() の使用から Rcpp を使用するパッケージに移行する方法の「ウォークスルー」です。エラーがある場合は、お気軽にこれを編集するか、私に知らせてください。編集します。

[注: このプロセスには RStudio を使用することを強くお勧めします。]

それで、sourceCpp() のことはうまくいったので、今度はパッケージをビルドする必要があります。これは難しいことではありませんが、Rcpp を使用したパッケージのビルドに関する情報は、任意の R パッケージで必要な完全なドキュメント (ただし、それは初心者の頭の上にあります) に及ぶため、少しトリッキーになる可能性があります。紹介(たまたま必要な詳細が省略される場合があります)。

ここでは、パッケージで使用する 2 つの .cpp ファイルの名前としてoneCpp.cppandtwoCpp.cppを使用します。

これが私が提案するものです:

A. まずtheCppFile.cpp、sourceCpp() でコンパイルされ、期待どおりに動作する のバージョンがあると仮定します。これは必須ではありませんが、Rcpp OR パッケージを初めて使用する場合は、以下のより複雑なケースに移る前に、この単純な状況でコードが機能することを確認することをお勧めします。

B. ここRcpp.package.skeleton()で、RStudio の [プロジェクト] > [プロジェクトの作成] > [Rcpp を使用したパッケージ] ウィザードを使用するか、パッケージをビルドします (強くお勧めします)。hadley/devtoolsまたはRcpp Attributes VignetteRcpp.package.skeleton()で使用に関する詳細を見つけることができます。Rcpp を使用してパッケージを作成するための完全なドキュメントはRcpp を使用するパッケージの作成にありますが、これは C++ の使い方をかなりよく知っていることを前提としており、Rcpp を実行する新しい「属性」の方法は使用しません。ただし、より複雑なパッケージを作成する方向に進む場合は、非常に貴重です。

パッケージのディレクトリ構造は次のようになります。

yourPackageName
- DESCRIPTION
- NAMESPACE
- \R\
    - RcppExports.R 
- Read-and-delete-me
- \man\
    - yourPackageName-package.Rd
- \src\
    - Makevars
    - Makevars.win
    - oneCpp.cpp 
    - twoCpp.cpp
    - RcppExports.cpp

すべての設定が完了したら、RStudio を使用している場合、または RStudio を使用していない場合は、「ビルドとリロード」をcompileAttributes()実行します。

C.\Rディレクトリに というファイルが表示されるはずですRcppExports.R。開いて確認してください。ディレクトリにRcppExports.Rあるすべての.cppファイルの R ラッパー関数が表示されます\src。かなり甘いですね。

D) で書いた関数に対応する R 関数を試してみてくださいtheCppFile.cpp。それは機能しますか?その場合は先に進みます。

E) ディレクトリを作成するときに、その.cppような新しいファイルをディレクトリに追加できるようになりました。次に、パッケージを再構築するだけで、R ラッパーが生成されて追加されます。RStudio では、これは Build メニューの "Build & Reload" だけです。RStudio を使用していない場合は、実行する必要がありますotherCpp.cpp\srcRcppExports.RcompileAttributes()

于 2013-01-13T22:05:49.540 に答える
3

あなたは木のために森を見逃しています。

sourceCpp()最近の機能です。これは、私たちが「Rcpp 属性」と呼んでいるものの一部であり、(パッケージ内、私の Web サイト、および CRAN に同じタイトルで) 独自のビネットがあり、読みたいと思うかもしれません。特に、コンパイルして実行しsourceCpp()たものをパッケージに変換する方法について詳しく説明しています。これはあなたが望むものです。

ドキュメンテーション間をランダムにジャンプしても役に立ちません。パッケージ作成者による本物のソース ドキュメンテーションの最後にある方が望ましい場合があります。または、別のスピンをかけると、新しい機能を使用していますが、それを反映していない古いドキュメントがあります。Rcpp を使って基本的なパッケージを書いてみてください。

最後に、メーリングリストがあります...

于 2013-01-12T01:32:14.323 に答える