如何从 Rcpp 中的另一个函数调用一个函数?

Posted

技术标签:

【中文标题】如何从 Rcpp 中的另一个函数调用一个函数?【英文标题】:How to call a function from another function in Rcpp? 【发布时间】:2021-06-25 20:51:02 【问题描述】:

我在 C++ 中定义了两个函数,我使用 Rcpp 包在 R 中调用它们。我将 f1 和 f2 函数都放在一个 cppFunction() 中。运行此程序后,f1 函数在 R 中正常工作,但在调用 f2 时出现此错误:“找不到函数 f2”。代码如下:

cppFunction('
std::vector<double> f1( double lambda, double gamma) 
double a = exp(-(lambda+gamma));
double b = lambda+gamma;
std::vector<double> v;
v.push_back(a);
v.push_back(b);
return v;

std::vector<double> f2(double lambda, double gamma ,double alpha) 
std::vector<double> res;
res=f1(lambda, gamma);
res[0] *= alpha;
res[1] *= 1-alpha;
double lik = res[0]+res[1];
res.push_back(lik);
res.push_back(res[1]);
return res;

')

您对如何解决此问题有任何建议吗?

【问题讨论】:

首先要做的是检查 rcpp 文档以确保您可以在一个 cppFunction 块中定义 2 个函数。 您(正如前面的评论所暗示的)受cppFunction() 的约束。使用sourceCpp() 或者写一个包。 你实际上可以使用cppFunction()(以及它的前身来自inline 包)但是你需要提供一个块列表,因为每个块都被包裹在幕后。 sourceCpp() 更简单。 @Dirk Eddelbuettel 谢谢,sourceCpp() 有效! 【参考方案1】:

您可以在cppFunction 中使用includes

cppFunction('
std::vector<double> f2(double lambda, double gamma ,double alpha) 
  std::vector<double> res;
  res=f1(lambda, gamma);
  res[0] *= alpha;
  res[1] *= 1-alpha;
  double lik = res[0]+res[1];
  res.push_back(lik);
  res.push_back(res[1]);
  return res;

', includes = 'std::vector<double> f1( double lambda, double gamma) 
  double a = exp(-(lambda+gamma));
  double b = lambda+gamma;
  std::vector<double> v;
  v.push_back(a);
  v.push_back(b);
  return v;
;
')

致谢:感谢Federico Manigrasso 中的this answer!

【讨论】:

以上是关于如何从 Rcpp 中的另一个函数调用一个函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何从Angular中的另一个函数调用一个函数?

如何从Python中的另一个函数调用函数内的函数? [重复]

如何从AngularJS中的另一个控制器调用函数? [复制]

如何在Rstudio中调用Rcpp向量的对数函数

如何从同一个类中的另一个构造函数调用抽象类的构造函数(方法重载)[重复]

如何从单独文件中的另一个视图调用主干视图函数