【问题标题】:How to call a function from another function in Rcpp?如何从 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() 有效!

标签: c++ r rcpp


【解决方案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

【讨论】:

    猜你喜欢
    • 2013-11-13
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多