RcppのsourceCpp()とパッケージ作成

  • こちらの時代はRcppでのRとC++の連結では、inlineというのを使ってRのコードの中にC++対応のソースを書いて…というやり方だった
  • RcppにsourceCpp()という関数ができて、C++で書いた関数を読み込む、というように変化していた
  • この方が楽
    • それについてはここにも書いたけれど、Rコード
library(Rcpp)
library(rbenchmark)
sourceCpp("fibCpp.cpp")

fibR <- function(n)
{
  if((n==0) | (n==1)){
    return(1)
  }
  return(fibR(n-1)+fibR(n-2))
}

benchmark(fibR(20),fibCpp(20),replications =1000)[,1:4]
  • さらにRcpp.package.skeleton()はc++ファイルを指定してパッケージ化のセット作成をしてくれる
    • まずc++なしだと、package.skeleton()のExamplesのように
## two functions and two "data sets" :
f <- function(x, y) x+y
g <- function(x, y) x-y
d <- data.frame(a = 1, b = 2)
e <- rnorm(1000)

package.skeleton(list = c("f","g","d","e"), name = "mypkg")
    • できる。これをRcpp.package.skeleton()にしようとして
Rcpp.package.skeleton("MyPackage", example_code = FALSE,list = c("f","g","d","e"),code_files = c("myR1.R","myR2.R"),cpp_files = c("myhoge.cpp"))
    • としたら、
以下にエラー call[["list"]] : 
   'special' 型のオブジェクトは部分代入可能ではありません
    • というエラーが出た…
    • list=c()を外すとうまくいくようなのだが…
Rcpp.package.skeleton("MyPackage", example_code = FALSE,code_files = c("myR1.R","myR2.R"),cpp_files = c("myhoge.cpp"))
  • と言うように取り込ませたい、R上のオブジェクトをlist=c()で指定し、Rコードファイル名をcode_files=c()で指定し、C++ファイル"myhoge.cpp"を指定して、"MyPackage"なるパッケージのスケルトンも作れるそうだ(example_code=FALSEというのは、このオプションがTRUEだと、Rcppパッケージが提供しているhello関数が取り込まれる設定になっているため)
  • 出来たディレクトリ・ファイルの構成をLinux上で
R CMD INSTALL myhoge
  • すればパッケージになって、それをパッケージとして読み込むだけ
R CMD INSTALL MyPackage_バージョン.tar.gz