我目前正在尝试使用 .cpp 文件通过 RcppGSL 使用 GSL 库中的 gsl_function,并使用 sourceCpp() 调用它。这个想法是用同样来自 GSL 的 gsl_integration_qags 进行数值积分。我的 C 代码调用保存到全局环境中的用户定义的 R 函数(我下面的代码中的 SomeRFunction)。代码是:
#include <RcppGSL.h>
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
#include <gsl/gsl_vector.h>
// [[Rcpp::depends(RcppGSL)]]
// [[Rcpp::export]]
double integfn1(double ub, double lb, double abserr, double Rsq, int pA){
double result, abserror;
Rcpp::Environment global = Rcpp::Environment::global_env();
Rcpp::Function f1 = global["SomeRFunction"];
struct my_f_params { double Rsq; int pA; };
struct my_f_params params = { Rsq, pA };
gsl_function F;
F.function = & f1;
F.params = ¶ms;
double lb1 = lb;
double ub1 = ub;
gsl_integration_workspace * w = gsl_integration_workspace_alloc (1000);
gsl_integration_qags (&F, lb1, ub1, 1e-8, 1e-8, 1000, w, &result, &abserror);
printf ("result = % .18f\n", result);
printf ("estimated error = % .18f\n", abserror);
gsl_integration_workspace_free (w);
return result;
}
出现以下错误:
"cannot convert 'Rcpp::Function* {aka Rcpp::Function_Impl<Rcpp::PreserveStorage>*}' to 'double (*)(double, void*)' "
问题出在我声明要集成的函数的行中(即“F.function = & f1;
”)。
我查找了类似的问题,但找不到任何列出的内容...任何提示将不胜感激!
非常感谢
最佳答案
我创建了一个工作示例(并针对 C 对其计时),您可以在其中将任意用户定义的 R 函数传递给 GSL 函数 QAWF。您也应该能够将其推广到其他 gsl 函数。
请参阅此处示例:https://sites.google.com/site/andrassali/computing/user-supplied-functions-in-rcppgsl
如上所述,竞争的 C 实现要快得多。
关于c++ - 使用提供的 R 函数使用 gsl_function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23332432/