0

Rcpp パッケージの使い方に戸惑っています。example.cpp によると、次の .cpp コードを保存した後、newRcppVectorExample の R 関数を使用する R コードは何ですか? コードはhttp://dirk.eddelbuettel.com/code/rcpp.examples.htmlからのものです。

パッケージを作成する必要がありますか? example.cpp を直接使用できますか? たとえば、R CMD SHLIB example.cpp の場合は、dyn.load 関数を使用します。

#include <RcppClassic.h>
#include <cmath>

RcppExport SEXP newRcppVectorExample(SEXP vector) {
BEGIN_RCPP

Rcpp::NumericVector orig(vector);                          
Rcpp::NumericVector vec(orig.size());                

std::transform(orig.begin(), orig.end(), vec.begin(), ::sqrt);

return Rcpp::List::create(Rcpp::Named( "result" ) = vec,
                          Rcpp::Named( "original" ) = orig) ;

END_RCPP
}
4

1 に答える 1

2

R 自体 (つまりR 拡張機能の記述 ) と Rcpp の紹介ビネット ( Journal of Statistical Software の論文でもある) から始めることができる Rcpp の両方について、ドキュメントに時間を費やすことをお勧めします。

.Call()つまり、パッケージを介してロードされたコンパイル済みコードにアクセスできる関数、または を介し​​てR を拡張しdyn.load()ます。しかし、ここでその資料を複製することにはほとんど意味がありません。

編集: RcppExamplesパッケージに表示されている例を見つけた場合、同じパッケージでそれを呼び出す方法は次のとおりです。

RcppVectorExample <- function(vec=seq(1,9)^2, api=c("classic", "new")) {

    api <- match.arg(api)               # match to classic or new
    fun <- paste(api, "RcppVectorExample", sep="")

    ## Make the call...
    val <- .Call(fun,                   # either new or classic
                 vec,
                 PACKAGE="RcppExamples")

    val
}

古い非推奨の API ( RcppClassicパッケージでまだ提供されています) または新しい API (コードを選択した) の いずれかを呼び出すことができるため、これは通常よりも少し複雑です。

重要なのは、.Call()名前が付けられた C++ 関数の最初の引数で使用され、その後に一連の引数と、共有ライブラリが見つかったパッケージを指す最後の引数が続くことです。

于 2012-09-22T01:34:56.723 に答える