Я пытаюсь вызвать подпрограмму C из кубатурного пакета в функции С++ для выполнения многомерного интегрирования.
Основной пример R, который я пытаюсь воспроизвести,
library(cubature)
integrand <- function(x) sin(x)
adaptIntegrate(integrand, 0, pi)
Я мог бы просто вызвать эту R-функцию из Rcpp после этого рецепта из галереи, но было бы некоторое снижение производительности при переключении взад и вперед от c/С++ до R. Кажется более разумным напрямую вызывать функцию C из С++.
Подпрограмма C adapt_integrate
экспортируется из cubature
с помощью
// R_RegisterCCallable("cubature", "adapt_integrate", (DL_FUNC) adapt_integrate);
Я не понимаю, как назвать это из С++. Здесь моя хромая попытка,
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.