多次元統合を実行するためにC++関数のcubatureパッケージからCルーチンを呼び出そうとしています。Rcpp内の他のパッケージのC関数を使用
私が再現しようとしている基本的なRの例は、
library(cubature)
integrand <- function(x) sin(x)
adaptIntegrate(integrand, 0, pi)
である私はちょうどthis recipe from the gallery次RcppからこのR関数を呼び出すことができますが、C/Cから前後に切り替えるにはいくつかのパフォーマンスのペナルティが存在することになる++ C++からC関数を直接呼び出す方が合理的です。
adapt_integrate
ルーチンCは、私はしかし、C++からそれを呼び出す方法を理解していない
// R_RegisterCCallable("cubature", "adapt_integrate", (DL_FUNC) adapt_integrate);
でcubature
からエクスポートされます。ここで私の不自由な試みは、
sourceCpp(code = '
#include <Rcpp.h>
using namespace Rcpp;
// [[Rcpp::export]]
double integrand(double x){
return(sin(x));
}
// [[Rcpp::depends(cubature)]]
// [[Rcpp::export]]
Rcpp::List integratecpp(double llim, double ulim)
{
Rcpp::Function p_cubature = R_GetCCallable("cubature", "adapt_integrate");
Rcpp::List result = p_cubature(integrand, llim, ulim);
return(result);
}
'
)
integratecpp(0, pi)
これはコンパイルに失敗します。明らかに私は非常にばかげた何かをして、R_GetCCallable
の出力をRcpp::Function
に変換する(またはそれを直接呼びますか?)いくつかの重要なステップがありません。関数ポインタを扱ういくつかの関連記事を読んだが、外部のC関数を使った例は見ていない。
これらの不足している部分を組み立てていただきありがとうございます。残念ながら、私は 'adapt_integrate'がarmadilloのデータ構造を使って定義した被積分関数を簡単に受け入れることができないため、問題を再考する必要があります。完全性のために、最小限の使用例を追加できますか? – baptiste
これは、 'cubature'が登録されている関数ポインタへのアクセスです。私は、あなたがC言語の関数を使って何をすべきかわからない... –
確かに、[使用の例を考えて](http://ab-initio.mit.edu/wiki/index.php/Cubature#例)私は問題を先読みしています: 'adapt_integrate_v'は' * fdata'のようなオブジェクトへのポインタを期待していますが、integrandは '* fval'のようなポインタを期待しています。 'arma :: colvec'オブジェクトです。私は両者の間に橋渡しをすることはできないだろうと思う。私は、Rレベルのインターフェイスに固執するか、またはC++で私自身の2D直交を実装する必要があります。 – baptiste