質問
どのように使用したC++図書館Rその保全にC++のデータ構造です。私はC++ユーザーだけではないの相対的なメリットで利用するアプローチ。R-extマニュアルか包装のC++の機能C.しかし、少なくともはやはりその他の手段を取り入れC++が存在します。
についてはパッケージw/同系統のRcpp(維持し、多数のoverflower Dirk Eddelbuettel)RcppTemplateパッケージ(CRAN、何の違いない。
他のパッケージには、rcppbind、Rを主張するなどとは全く異なるアプローチを結合C++R(い知識を伝え).
このパッケージインラインの利用CRAN、請求めのインラインC/C++くなったことは異なり、内蔵機能別のコードするインラインw/R.
最RSwigが発表されることになります 野生の もしか対応では、 著者ページ ていない更新されています。
私の質問は、どのように相対的なメリットはこれらの異なるアプローチ。の携帯型、堅牢なるのが最も簡単に類するものをいいます。また計画を配布パッケージCRANの方法をお使いになりますか?
解決
まず、免責事項:使ってい Rcpp ます。これらを実現していくには有名前が変更になった時からRcpp)RcppTemplateして孤児となく更新のための二年に開始していますの維持の下で、その初期の名Rcpp(ることが必要不可欠となっていたのに寄与して参りました RQuantLib).た約一年前、私はカップルの増分の変更がきっと見つかるはずで記録されChangeLog.
今RcppTemplateも最近した後、全三十五ヶ月ずに更新または修正.で興味深い新しいコードで表示されないとの後方互換性がないので、使って使用されてRcpp.
Rcppbind ませんでした非常に積極的に維持されるときに確認します。私は東京または分子を鋳型としたスパッケージと呼ばれ rabstraction.
インライン 何か全く異なる:すべてのコンパイル/リンクサイクルによる埋め込み'プログラムとしてのRる文字列を取得しを作成し、リンクは、みなされます。私たOlegについてはインライン支援Rcppるといいですね。
Swig も興味深い。ジョー王がんばったりに包まれたすべてのQuantLib Rしかし最終試みでなくなったように変化R internals.別の誰かがSwigチームは、ジョーがいます。の目標は扉が大きい図書館。このプロジェクトがもう復活ですがな技術課題です。
別の言及があります。 RInside をRcppき込Rの内部にサポートします。
ようにされている Rcpp もう、萌芽的プロジェクトだけを追加したい機能があります。での使いやすさ、などができます。'非表示一部の炉内構造物にはない楽しいものです。たんのユーザー名また、オフをメールにて差し上げます。でいくことです。
私の"Intro HPCとR'のチュートリアル一例Rcpp,RInsideおよびインライン.
編集: でを振り返ってみたいと思い具体的な例からのHPC R紹介'スライドは借りてからスティーブンMilborrow人からVenables、プールサイドバー、バー/ラウン).では、タスクを列挙すべての可能な組み合わせの決定要因の2x2マトリクスを含むからコミュニケーションを桁の各位置にします。することができなvectorised方法としてのチュートリアルのスライド)による力として
#include <Rcpp.h>
RcppExport SEXP dd_rcpp(SEXP v) {
SEXP rl = R_NilValue; // Use this when there is nothing to be returned.
char* exceptionMesg = NULL; // msg var in case of error
try {
RcppVector<int> vec(v); // vec parameter viewed as vector of ints
int n = vec.size(), i = 0;
if (n != 10000)
throw std::length_error("Wrong vector size");
for (int a = 0; a < 9; a++)
for (int b = 0; b < 9; b++)
for (int c = 0; c < 9; c++)
for (int d = 0; d < 9; d++)
vec(i++) = a*b - c*d;
RcppResultSet rs; // Build result set to be returned as list to R
rs.add("vec", vec); // vec as named element with name 'vec'
rl = rs.getReturnList(); // Get the list to be returned to R.
} catch(std::exception& ex) {
exceptionMesg = copyMessageToR(ex.what());
} catch(...) {
exceptionMesg = copyMessageToR("unknown reason");
}
if (exceptionMesg != NULL)
Rf_error(exceptionMesg);
return rl;
}
保存されることとしてい dd.rcpp.cpp
してい Rcpp を設置し、それを使用
PKG_CPPFLAGS=`Rscript -e 'Rcpp:::CxxFlags()'` \
PKG_LIBS=`Rscript -e 'Rcpp:::LdFlags()'` \
R CMD SHLIB dd.rcpp.cpp
の構築を意図しています。を使用していま Rscript
( r
)へのお願い Rcpp 約そのヘッダの図書館です。次に、できる負荷を上げることをRとして
dyn.load("dd.rcpp.so")
dd.rcpp <- function() {
x <- integer(10000)
res <- .Call("dd_rcpp", x)
tabulate(res$vec)
}
同じように送ることができベクトルmatrics,...各種RとC++データの種類を期待する。武器agiは、dexで下がらないboxerぐ幾分強含んでいる。
編集2(一五年後):
この答えだっupvoteが湧き上がってきたので私のキューに挿入しますA 多く 時間経過以降に書いたので、Rcpp頂いてい 多く 豊かな特徴です。私は非常に素早く書いたこ
#include <Rcpp.h>
// [[Rcpp::export]]
Rcpp::IntegerVector dd2(Rcpp::IntegerVector vec) {
int n = vec.size(), i = 0;
if (n != 10000)
throw std::length_error("Wrong vector size");
for (int a = 0; a < 9; a++)
for (int b = 0; b < 9; b++)
for (int c = 0; c < 9; c++)
for (int d = 0; d < 9; d++)
vec(i++) = a*b - c*d;
return vec;
}
/*** R
x <- integer(10000)
tabulate( dd2(x) )
*/
使用できるとして、次のコードファイル /tmp/dd.cpp
R> Rcpp::sourceCpp("/tmp/dd.cpp") # on from any other file and path
R> x <- integer(10000)
R> tabulate( dd2(x) )
[1] 87 132 105 155 93 158 91 161 72 104 45 147 41 96
[15] 72 120 36 90 32 87 67 42 26 120 41 36 27 75
[29] 20 62 16 69 19 28 49 45 12 18 11 57 14 48
[43] 10 18 7 12 6 46 23 10 4 10 4 6 3 38
[57] 2 4 2 3 2 2 1 17
R>
一部の違い:
- 簡単な構築:だけで
sourceCpp()
ま;でも実Rコード試験の終了 - 本格的な
IntegerVector
タイプ - 例外を扱うラッパーを自動的に追加
sourceCpp()
コード発生装置