C++の関数はあるんだけど…というとき

  • ここ数日の記事はC(→C++)とそれを見越してのRcpp
  • Rstudioと連携しての実行、さらにパッケージ化とかに手を染めるが、pathやらコンパイラやらで面倒多し
  • とりあえず、Rstudioを言われた通りにいれる(こんな風に)とその上では、C++ソースをsourceCpp()で使えることがわかっているので、それでやる(Rstudioを使わなくてもsourceCpp()が使えれば問題ない(はず))
  • C++の関数を見つけたとする(たとえばこちら):\tanh^{-1}(x) = \frac{1}{2}\log{\frac{1+x}{1-x}}のような(もちろんこれに対応するRの関数はあるわけだけれど、ここでは、この中身がわんさかあってちょっと無理、というような場合を想定
double atanh(double);
  • これをC++関数として、Rcpp.hとR用(Rstudio用)に書きだすRcpp::exportと合わせてやる(こんなことしなくても本当はよいのかも…)
#include <Rcpp.h>

// [[Rcpp::export]]
double atanhCpp(double x)
{
  double ret = atanh(x);
  return ret;
}
-そのうえで、R側では
>|r|
library(Rcpp)
sourceCpp("myatanh.cpp")
  • とやって、"mytanh.cpp"に書いたatanhCpp()を使えるようにする
  • そのうえで次のようにやるとatanCpp()の処理はC++になっている
n <- 100
r <- runif(n)
out <- rep(0,n)
for(i in 1:n){
  out[i] <- atanhCpp(r[i])
}
plot(r,out)