Rcppで定義するC++の関数に関数を渡すときはRcpp::FuncでOK

この辺

の例では1引数しか渡さないケースばかりだったので、複数引数の関数を渡せることに気がつかなかった。以下では適当な関数(someFunc)と、Rから関数を引数に取って処理を行う関数callFuncを定義している。

library(Rcpp)
sourceCpp(code='
  #include <Rcpp.h>
  using namespace Rcpp;

  // [[Rcpp::export]]
  NumericVector someFunc(NumericVector x, double t, CharacterVector c) {
    return (x+t);
  }
  // [[Rcpp::export]]
  NumericVector callFunc(NumericVector x, double t, CharacterVector c, Rcpp::Function func) {
    return func(x, t, c);
  }
')

実際に使ってみると・・・

> f <- function(x, t, s){x+t}
> callFunc(1:10, 1, "A", f)
 [1]  2  3  4  5  6  7  8  9 10 11
> callFunc(1:10, 1, "A", someFunc)
 [1]  2  3  4  5  6  7  8  9 10 11

となる。第三引数のCharacterVectorは、ちゃんと渡せるかを確認したかったただのおまけ。

参考

Rcpp::Funcの実装はここ