Chapter 36 Rcpp Attributes

Rcpp Attributes はコンパイルに必要な情報をコンパイラに教えます。

36.1 利用可能な Rcpp Attributes

以下では、Rcppパッケージで利用可能な Rcpp Attributes の一覧とその機能を解説します。

36.1.1 Rcpp::export

// [[Rcpp::export]] を記述した直下で定義した C++ の関数は R から利用可能になります。

// [[Rcpp::export]] を記述した関数は compileAttributes() により処理され、改変された関数が src/RcppExports.cpp に生成されます。さらに、src/RcppExports.cpp で定義された C++ 関数を呼び出すRの関数が R/RcppExports.R に生成されます。

また、デフォルトでは C++ で定義した関数名と同名の関数がRで利用可能になります。しかし、C++の関数名の命名規約とRの関数の命名規約が異なるために、Rの関数名として利用できる文字のうち、C++の関数名としては利用できない文字(.)もあります。その場合には下のように記述することで、Rで利用可能になる関数名を指定することができます。

// [[Rcpp::export(".myCppFunction")]]
// [[Rcpp::export]]
int fibonacci(const int x) {

   if (x == 0) return(0);
   if (x == 1) return(1);

   return (fibonacci(x - 1)) + fibonacci(x - 2);
}

// [[Rcpp::export("convolveCpp")]]
NumericVector convolve(NumericVector a, NumericVector b) {

   int na = a.size(), nb = b.size();
   int nab = na + nb - 1;
   NumericVector xab(nab);

   for (int i = 0; i < na; i++)
      for (int j = 0; j < nb; j++)
         xab[i + j] += a[i] * b[j];

   return xab;
}

36.2 Rcpp::interfaces

// [[Rcpp::interfaces(r, cpp)]]

36.3 Rcpp::depends

// [[Rcpp::depends(RcppArmadillo)]]
// [[Rcpp::depends(Matrix, RcppGSL)]]

36.4 Rcpp::plugins

// [[Rcpp::plugins(plugin1, plugin2)]]
// [[Rcpp::plugins(cpp11)]]

36.5 Rcpp Attributes を処理する Rcpp の関数

36.5.1 compileAttributes()

ソースコード中の Rcpp Attributes を読み取り、定義した C++ 関数を呼び出す R 関数を自動で生成する。

compileAttributes(pkgdir = ".", verbose = getOption("verbose"))