Rcppを用いたPackage を自分でビルドしてみる

1,379 views

Published on

RStudioを使用したパッケージのビルド方法についての備忘録です.
はじめにRcppSMCパッケージを例にあげての説明を行います。
つぎに, あるRcppを用いたパッケージのC++関数を, Rcppのソースコード中で使用する方法を説明します. sourceCpp()を使用する場合と, 他のパッケージで使用する場合の2つについて記しています.(追記: Rcpp 0.10.2だとエラーが出るようです...)

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,379
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Rcppを用いたPackage を自分でビルドしてみる

  1. 1. RcppSMCパッケージのソースを使用して, 1からパッケージを作成する手順を以下に記 す. RcppSMC: Rcpp bindings for Sequential Monte Carlo http://cran.r-project.org/web/packages/RcppSMC/index.html 1. RcppMySMCパッケージを作成し, そのsrcディレクトリに以下を保存する. RcppSMCの ・srcのcppファイル ・inst/includeのhファイル RStudioによるRcppを使ったパッケージ作成が簡単に行える. 詳しくは http://www.rstudio.com/ide/docs/advanced/using_rcpp 2. Clean and Rebuild(RStudio) ビルドは通る. ただし, RcppSMCの公開用の関数は公開されていない. 3. cppファイルの修正 Rcpp Attribute を用いて書き直す. extern "C" となっているfunctionについて, extern "C" の使用をやめて // [[Rcpp::export]] 属性を使う. 修正前 extern "C" SEXP pfLineartBS(SEXP dataS, SEXP partS, SEXP usefS, SEXP funS) { 修正後 // [[Rcpp::export]] SEXP pfLineartBS(SEXP dataS, SEXP partS, SEXP usefS, SEXP funS) { 4. Build and Reload compileAttributes()が実行され, Rcpp::exportを適用したfunctionがRに公開される. ==> Rcpp::compileAttributes() * Updated src/RcppExports.cpp * Updated R/RcppExports.R 5. ヘッダファイルを専用のディレクトリに移す 他のパッケージのように, inst/include ディレクトリを作成し, ここに.hファイルをmvする. このままClean and Rebuildするとエラーが出る. ヘッダファイルを参照出来ないためで ある.
  2. 2. 6. src/Makevarsへの追記 ビルドオプションの変数を追記する. ヘッダファイルの場所はsrcの位置からの相対パス で指定できる. ## combine with standard arguments for R PKG_CPPFLAGS = -I../inst/include PKG_LIBS += $(RCPP_LDFLAGS) ※Writing R Extentions http://cran.r-project.org/doc/manuals/R-exts.pdf の説明 The most common use of a ‘Makevars’ file is to set additional preprocessor options (for example include paths) for C/C++ files via PKG_CPPFLAGS, and additional compiler flags by setting PKG_CFLAGS, PKG_CXXFLAGS, PKG_FFLAGS or PKG_FCFLAGS, for C, C++, FORTRAN or Fortran 9x respectively (see Section 5.5 [Creating shared objects], page 101). NB: Include paths are preprocessor options, not compiler options, and must be set in PKG_CPPFLAGS as otherwise platform-specific paths (e.g. ‘-I/usr/local/include’) will take precedence. 7. Clean and Rebuild 4と同じようにRに公開したいfunctionが公開出来る形態でビルドが完了する. パッケージを作成する際に, 他のパッケージで用いられているC++の関数を使用したい 場合がある. 1. 被呼び出し関数の作成 以下のようなソースファイルを持つRcppを使ったパッケージRcppMyLib1をRStudioに より作成・ビルドする. hoge(), fuga()はrとcppの関数として公開される. cppの関数として公開されるとは, inst/include直下にヘッダファイルが作成されるとい うことである.
  3. 3. 他のパッケージから参照するときには, DESCRIPTIONファイルのDependsとLinkingTo に このパッケージ名を記述する. interfaces Attributes で rを記述しないと, Rへの公開がなくなる. Rへの公開はRディレクトリのRcppExports.Rファイルにて行われているので確認する と良い. whatで指定されている文字列の関数がRに公開される. この例でloadModule対象となっているRcppMyLib1_RcppExportsは, src直下に自動生成されるRcppExports.cppに記述されている「Rcppのモジュール」で ある. RCPP_MODULE(名前)で「名前のRcppモジュール」が生成される. この「Rのモジュール」がRcpp::loadModuleによってロードされている. [補足] たとえばRcppを使ったパッケージならRcppの関数を参照できる必要がある. その設定がRStudioによるパッケージ作成/wRcppで自動的に行われている. DESCRIPTIONファイルにRcppという文字列があるが, これがその自動設定である. 2. 呼び出し方 2.1 sourceCpp()を使う場合 Rcpp::depends() attributesを用いる.
  4. 4. 警告が出るが, 実行出来る. この警告についてきちんと理解しておきたいところである… 2.2 他のパッケージから呼ぶ場合 呼び出し主体のパッケージのDESCRIPTIONファイルに使用したいパッケージを記す. 呼び出し側ソースファイルについては, 2.1 sourceCpp()の場合と違って, Rcpp::depends() attributes を外しておく. 2.1と同じ結果が得られる. [参考文献] Rcpp Attributes

×