ここで起こっていることは2つあります。(1)Rcppとその仲間を使って、Rコードを高速化する方法を学んでいるところです。(2)これまでRパッケージを作成したことがありません。
私はinline
ダウンを使用しています。素晴らしいパッケージ。大好きです。ただし、で開発したコードを使用してRパッケージを作成することはできないようinline
ですpackage.skeleton
。
最小限の例を次に示します。
ステップ1:Rスクリプトを作成する
#############################
# File : build-R-pacakge.R #
#############################
require(inline)
require(Rcpp)
require(RcppArmadillo)
# Define a simple cxxfunction
plus.two.cpp.src <- '
arma::mat U = Rcpp::as<arma::mat>(UmatrixR);
return(Rcpp::wrap(U+2));
'
plus.two.cpp <- cxxfunction(
signature(UmatrixR="numeric"),
body=plus.two.cpp.src,
plugin="RcppArmadillo")
# Define the analogous R function
plus.two.r <- function( x ) {
return( x + 2 )
}
ステップ2:Rパッケージとしてビルドする
新しいRセッションの実行:
source('build-R-package.R')
RcppArmadillo.package.skeleton(name='inlineExample',
list=c('plus.two.cpp', 'plus.two.r'),
code_files='build-R-package.R')
次にman/*.Rd
、Rは「正常に機能する」デフォルトを設定しないため、ファイルを削除します。
$ rm inlineExample/man/*.Rd
そして実行します:
$ R CMD build inlineExample/
<< snip >>
$ R CMD check inlineExample_1.0.tar.gz
<< snip >>
$ R CMD INSTALL inlineExample_1.0.tar.gz
<< snip >>
ドキュメントの欠落について不満を言う人を除いて、すべて正常に完了します。
ステップ3:試してみる
そして、新しいRセッションで試してみてください。
> require(inlineExample)
Loading required package: inlineExample
Loading required package: Rcpp
Loading required package: RcppArmadillo
Loading required package: inline
>
> plus.two.cpp( matrix(1:12, ncol=3))
Error in .Primitive(".Call")(<pointer: (nil)>, UmatrixR) :
NULL value passed as symbol address
>
> plus.two.cpp
An object of class "CFunc"
function (UmatrixR)
.Primitive(".Call")(<pointer: (nil)>, UmatrixR)
<environment: 0x2f28370>
Slot "code":
[1] "\n// includes from the plugin\n#include <RcppArmadillo.h>\n#include <Rcpp.h>\n\n\n#ifndef BEGIN_RCPP\n#define BEGIN_RCPP\n#endif\n\n#ifndef END_RCPP\n#define END_RCPP\n#endif\n\nusing namespace Rcpp;\n\n\n// user includes\n\n\n// declarations\nextern \"C\" {\nSEXP file2f8c4cc10657( SEXP UmatrixR) ;\n}\n\n// definition\n\nSEXP file2f8c4cc10657( SEXP UmatrixR ){\nBEGIN_RCPP\n\n arma::mat U = Rcpp::as<arma::mat>(UmatrixR);\n return(Rcpp::wrap(U+2));\n\nEND_RCPP\n}\n\n\n"
失敗します。私の訓練されていない目には、次のように思われます。
- コンパイルされたコードは
inline
、*。package.skeletonによってディレクトリスケルトンの「右」部分にコピーされて、後でRビルドプロセスによってコンパイルされることはありません。 - 'code_files'引数が失敗しても、パッケージのロード時にRがこれらの*.Rファイルをソースすることはありません。
これについてさらに考えると、(2)は、ユーザーがパッケージをロードするたびにコードをコンパイルする必要があるため、非常に悪い考えのように思われます。それは、バイナリのみのパッケージを必要とするすべてのユーザーを除外し、単に本当に非効率的です。
(1)技術的には可能のようですが、Rcppメーリングリストで説明されているように、一連の自動マジックコンバーター機能を実装する価値はありません。
だから、質問:
誰かが提供されたサンプルコードを取得してそれをRパッケージに変換する正しい方法のウォークスルーを教えてもらえますか?
既存のドキュメントを理解するには、少し新しすぎます。FWIW、将来的には役立つと思います!