使用Rcpp中其他包中的C函数
using C function from other package in Rcpp
我正试图从C++函数中的cubature包中调用一个C例程来执行多维集成。
我试图复制的基本R示例是
library(cubature)
integrand <- function(x) sin(x)
adaptIntegrate(integrand, 0, pi)
我可以按照库中的这个配方从Rcpp调用这个R函数,但从c/c++到R来回切换会有一些性能损失。从c++直接调用c函数似乎更明智。
使用从cubature
导出C例程adapt_integrate
// 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函数的例子。
不幸的是,cubature
没有在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*,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);
}
与cubature
的维护者协商,他在inst/include
中发布声明,这样您就只需要使用LinkingTo
,这可能是一个好主意。
之前没有看到这个问题,看起来@Romain解决了这个问题。
为了完整起见,xts
和RcppXts
包提供了一个在各方合作时如何做到这一点的工作示例。在xts
中,我们在(源)文件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);
}
以及CCD_ 14和CCD_。
在RcppXts
中,这被作为(在Rcpp模块中)拾取
function("xtsLag",
&xtsLag,
List::create(Named("x"), Named("k"), Named("pad")),
"Extract the coredata from xts object");
这非常有效。有人斥责我把xts
写得更紧凑(因为if NULL
是假的),我会得到。。。最后
这个问题已经存在三年了,但我想指出的是,既然RcppNumerical库可用,与Rcpp的多维集成可能会更容易:https://github.com/yixuan/RcppNumerical
计算积分的例程基于Thomas Hahn的Cuba包,也可以在CRAN的R2Cuba库中找到,所以如果你可以接受在Cubature的函数adaptIntegrate()
上使用Cuba例程,这个包可能会很有趣。
- 如何在 C# 中将带有参数的函数绑定到包中
- 从函数参数包中删除最后一项
- 将函数应用于元组中的每个元素,将每个元素强制转换为类型包中的不同类型,然后作为参数包传递
- 了解元函数以在类型包中查找类型
- 关于函数模板中定义的 lambda 闭包类型可以说些什么?
- 在闭包中,如何通过存储在内存中的指针或引用类型捕获可变性或用现代函数式语言进行处理?
- 对参数包中的每个元素应用函数
- 在参数包中获取函数指针的返回类型,并将其保存为与其他参数连接的元组
- c++11 lambda 真的支持闭包吗?函数变量中存在语义冲突
- 使用从外部参数包中获取的参数类型声明函数
- 函数从windows XP中的数据包中检索标头目标地址
- 如果在可变参数模板解包中达到终止函数,则出现异常
- 在变差函数的不同参数包中推导两个不同的已知类型变量
- 定义参数包扩展的"pattern",尤其是在函数调用中
- Rcpp:我的距离矩阵程序比包中的函数慢
- 在包含 R/Cpp 代码的 R 包中使用 roxygen2 for R 函数
- 使用Rcpp中其他包中的C函数
- 以错误的顺序将函数应用于参数包中的每个元素
- RcppEigen - 从内联到包中的.cpp函数和"Map"
- 为什么在函数调用中不将模板参数包推导为多个类型参数?