- こちらの時代はRcppでのRとC++の連結では、inlineというのを使ってRのコードの中にC++対応のソースを書いて…というやり方だった
- RcppにsourceCpp()という関数ができて、C++で書いた関数を読み込む、というように変化していた
- この方が楽
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のように
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