Rcppで使ったファイルをコンパイル済みで利用する。パッケージ化

はじめに

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;
 }