はじめに
Rcppで作ったcppファイルをコンパイルしてから利用できるようにする。 パッケージ化が必要らしい。具体的には以下のように行う.
パッケージを作る.
skeleton
関数を利用する
Rcpp::Rcpp.package.skeleton("myPackage",cpp_files="test.cpp")
パッケージをインストール
source
モードを利用する
install.packages("myPackage",repos=NULL,type="source")
もし、boost等の外部ライブラリを利用する場合は、makevarsをいじるのが 正当なきもするが、とりあえず、インストールする前に
Sys.setenv("PKG_CXXFLAGS"="-std=c++11 -I/opt/local/include -I/home/usr1/usr/local/boost/include -L/opt/local/lib/ -L/home/usr1/usr/local/boost/")
を指定してコンパイルオプションを変更しておく。usr1は適切なユーザー名やパスに変える。
パッケージを利用する
library("myPackage") beta_pow_u(3,5,0.1,0.1,5.5,0.6)
参考C言語のコードの例 test.cpp
#include <Rcpp.h> using namespace Rcpp; double beta_pow(int x2,int size2,double p1,double p2,double gamma){ double str=0; for(int j4=0;j4<=x2;j4++){ //str=str+pow((-1),j)*gsl_sf_choose(x2,j)*gsl_sf_beta(gamma*(j+size2-x2)+p2*p2, p1*p1); str=str+pow((-1),j4)*R::choose(x2,j4)*R::beta(gamma*(j4+size2-x2)+p2*p2, p1*p1); } //return gsl_sf_choose(size2,x2)/gsl_sf_beta(p1*p1,p2*p2)*str; return R::choose(size2,x2)/R::beta(p1*p1,p2*p2)*str; } double beta_pow_0(int x2,int size2,double p1,double p2,double gamma){ return beta_pow(x2,size2,p1,p2,gamma)/(1-beta_pow(0,size2,p1,p2,gamma)); } double beta_pow_u(int x2,int size2,double p1,double p2,double gamma,double u=0.6){ double vvv1; double vvv2; double vvv; vvv1=beta_pow_0(x2,size2,p1,p2,gamma); vvv2=0; if(x2+1<=size2){ for(int j=(x2+1);j<=size2;j++){ vvv2=vvv2+1.0/(j-1.0)*beta_pow_0(j,size2,p1,p2,gamma); } } if(x2!=1){ vvv=u*vvv1+(1-u)*vvv2; }else{ vvv=vvv1+(1-u)*vvv2; } return vvv; } //double x; int size; double p1;double p2; // [[Rcpp::export]] Rcpp::NumericVector d_web_b2(Rcpp::IntegerVector x, Rcpp::IntegerVector m, Rcpp::NumericVector p1, Rcpp::NumericVector p2, double u=0.6) { Rcpp::NumericVector resVec(x.size()); double gamma=5.5; for (int i=0; i < x.size(); ++i) { try{ resVec[i] = beta_pow_u(x[i],m[i],p1[i],p2[i],gamma,u); }catch (char *str2){ resVec[i] = std::numeric_limits<double>::infinity(); } } return resVec; }