如何从 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 中的另一个函数调用一个函数?的主要内容,如果未能解决你的问题,请参考以下文章
如何从Python中的另一个函数调用函数内的函数? [重复]
如何从AngularJS中的另一个控制器调用函数? [复制]