我试图从c函数中的立方体包中调用C例程来执行多维集成.
我想要重现的基本的R示例是
library(cubature) integrand <- function(x) sin(x) adaptIntegrate(integrand,pi)
我可以在this recipe from the gallery之后从Rcpp调用这个R函数,但是从c / c到R的转换会有一些性能损失.从C直接调用C函数似乎更加明智.
C程序适应整合从立方体导出
// R_RegisterCCallable("cubature","adapt_integrate",(DL_FUNC) adapt_integrate);
但是,我不明白如何从c中调用它.这是我的跛脚尝试,
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函数的例子.
解决方法
不幸的是,立方体不会在inst / include中发送头文件,所以你必须借用它们,并在你的代码中做这样的事情:
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*,double,double*,double*) ; Fun fun = (Fun) R_GetCCallable( "cubature","adapt_integrate" ) ; return fun(fdim,f,fdata,dim,xmin,xmax,maxEval,reqAbsError,reqRelError,val,err); }
对于他在inst / include中发出声明的立方体的维护者来说,可能是一个好主意,所以你只需要使用LinkingTo.