9

ここで起こっていることは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"

失敗します。私の訓練されていない目には、次のように思われます。

  1. コンパイルされたコードはinline、*。package.skeletonによってディレクトリスケルトンの「右」部分にコピーされて、後でRビルドプロセスによってコンパイルされることはありません。
  2. 'code_files'引数が失敗しても、パッケージのロード時にRがこれらの*.Rファイルをソースすることはありません。

これについてさらに考えると、(2)は、ユーザーがパッケージをロードするたびにコードをコンパイルする必要があるため、非常に悪い考えのように思われます。それは、バイナリのみのパッケージを必要とするすべてのユーザーを除外し、単に本当に非効率的です。

(1)技術的には可能のようですが、Rcppメーリングリストで説明されているように、一連の自動マジックコンバーター機能を実装する価値はありません。

だから、質問:

誰かが提供されたサンプルコードを取得してそれをRパッケージに変換する正しい方法のウォークスルーを教えてもらえますか?

既存のドキュメントを理解するには、少し新しすぎます。FWIW、将来的には役立つと思います!

4

1 に答える 1

10

ステップ1:物事がどのように機能するかを理解するために、 Rcppなしでダミーパッケージを作成します。

ステップ2:Rcppを使用するパッケージの作成方法に関するDirkの説明を読んでください。

私が読んinlineだことから、パッケージ内のRcppを難しくするのは簡単ではないようです。

于 2012-07-12T17:16:10.990 に答える