Rcpp同一cppFunction中定义的f2无法在R中调用该如何修复
问题原因
cppFunction 本质是为快速导出单个C++函数到R环境设计的接口,当你在同一段传入的C代码里定义多个函数时,默认只会把第一个定义的函数暴露给R环境,其余函数仅作为C层面的内部函数可用,不会被导出到R的全局环境,所以调用f2时会提示找不到该函数。
可行解决方案
方案1:使用
sourceCpp导入(最推荐,适合多函数场景)
把你写的C++代码单独保存为一个后缀为.cpp的文件,在每个需要导出到R的函数上方加// [[Rcpp::export]]注解,示例代码如下:#include <Rcpp.h> using namespace Rcpp; // [[Rcpp::export]] 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; } // [[Rcpp::export]] 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; }之后在R里执行
sourceCpp("你的文件路径/文件名.cpp"),就可以在R环境直接调用f1和f2两个函数。方案2:拆分多次调用
cppFunction(适合临时快速测试场景)
如果不想单独存cpp文件,也可以分两次调用cppFunction,注意要先定义f1,再定义f2,同时在f2的代码里提前声明f1的函数原型,避免C++编译阶段找不到f1:# 先导出f1 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; } ') # 再导出f2,先声明f1的函数原型,告知编译器f1的存在 cppFunction(' std::vector<double> f1(double lambda, double gamma); 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; } ')执行完两段代码后f1和f2都可以在R环境正常调用。
内容的提问来源于stack exchange,提问作者Maryam
相关产品推荐
相关产品推荐

