c – 使用Rcpp中其他程序包的C函数

前端之家收集整理的这篇文章主要介绍了c – 使用Rcpp中其他程序包的C函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从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.

猜你在找的C&C++相关文章