I\'m trying to call a C routine from the cubature package in a c++ function to perform multidimensional integration.
The basic R example I\'m trying to reproduce is
This question is three years old now but I want to point out that multidimensional integration with Rcpp may be easier now that the RcppNumerical library is available: https://github.com/yixuan/RcppNumerical
The routines for computing integrals are based on Thomas Hahn's Cuba package and are also available in the R2Cuba library on CRAN, so if you can accept using the Cuba routines over the function adaptIntegrate()
from Cubature, this package may be of interest.
Didn't see this question earlier, and it looks like @Romain addressed it.
For completeness, a working example of how to do this when all parties play along is provided by the xts
and RcppXts
packages. In xts
, we do this (for about ten functions) in the (source) file inst/include/xtsAPI.h
:
SEXP attribute_hidden xtsLag(SEXP x, SEXP k, SEXP pad) {
static SEXP(*fun)(SEXP,SEXP,SEXP) = NULL;
if (fun == NULL)
fun = (SEXP(*)(SEXP,SEXP,SEXP)) R_GetCCallable("xts","lagXts");
return fun(x, k, pad);
}
along with the usual business of R_registerRoutines
and R_RegisterCCallable
.
In RcppXts
this is picked up (in an Rcpp Module) as
function("xtsLag",
&xtsLag,
List::create(Named("x"), Named("k"), Named("pad")),
"Extract the coredata from xts object");
which works pretty well. Someone reprimanded me to write the xts
side more compactly (as the if NULL
is spurious) which I will get to ... eventually.
Unfortunately cubature
does not ship the headers in inst/include
, so you have to borrow that from them and do something like this in your code:
typedef void (*integrand) (unsigned ndim, const double *x, void *,
unsigned fdim, double *fval);
int adapt_integrate(
unsigned fdim, integrand f, void *fdata,
unsigned dim, const double *xmin, const double *xmax,
unsigned maxEval, double reqAbsError, double reqRelError,
double *val, double *err)
{
typedef int (*Fun)(unsigned,integrand,void*,unsigned,
const double*,const double*, unsigned, double, double, double*, double*) ;
Fun fun = (Fun) R_GetCCallable( "cubature", "adapt_integrate" ) ;
return fun(fdim,f,fdata,dim,xmin,xmax,maxEval,reqAbsError, reqRelError,val,err);
}
It might be a good idea to negociate with the maintainer of cubature
that he ships declarations in inst/include
so that you'd only have to use LinkingTo
.