使用Rcpp包在R中包含C ++,我尝试编译我的C ++文件。这是错误:
'功能'在命名空间' std'没有命名模板类型
经过调查,我被告知我的代码使用了一些只能从C ++ 11中获得的功能。所以我需要在Makevars文件中添加一行。但是,我发现了一个小插图,说Makevars不再是强制性的:Rcpp vignette。我该如何解决这个问题?
以下是C ++脚本中不起作用的部分:
std::function<void(const state_type, state_type, const double)> eqsir2(const Rcpp::NumericVector theta) {
return [&theta](const state_type &x, state_type &dxdt, const double t) {
boost_array_to_nvec2(x, nvec);
my_fun22(nvec,t,theta);
nvec_to_boost_array2(nvec, dxdt);
}
答案 0 :(得分:6)
为了能够在C ++中使用std::function
,您必须通过
#include <functional>
代码库中的某处。
对于R端,您必须告诉编译器您要使用C ++ 11功能。如果您只是通过.cpp
添加了Rcpp::sourceCpp
文件,则必须添加
// [[Rcpp::plugins(cpp11)]]
到您的.cpp
文件。
如果你正在写一个R包(你引用的插图就是为了这个),那么使用src/Makevars
不再强制Rcpp
文件,而是使用CXX_STD
src/Makevars
是在编写程序包时请求C ++ 11的建议方法。或者,您可以在SystemRequirements
中使用DESCRIPTION
。引自Writing R extensions:
为了在包中使用C ++ 11代码,包的Makevars文件 (或Windows上的Makevars.win)应包含行
CXX_STD = CXX11
然后将使用C ++ 11编译器进行编译和链接。
没有src / Makevars或src / Makefile文件的包可以指定 它们需要C ++ 11来代替src目录中的代码,包括'C ++ 11' 在DESCRIPTION文件的'SystemRequirements'字段中,例如
SystemRequirements:C ++ 11
如果包中有src / Makevars [.win]文件,则设置make 变量'CXX_STD'是首选,因为它允许R CMD SHLIB工作 正确地在包的src目录中。
此外,您必须确保返回函数和lambda的签名相同(参见例如here)。就目前而言,您只使用其中一个参考。两者都是可能的,你必须保持一致:
#include <Rcpp.h>
// [[Rcpp::plugins(cpp11)]]
#include <functional>
// [[Rcpp::depends(BH)]]
#include <boost/array.hpp>
typedef boost::array<double, 3> state_type;
// references
std::function<void(const state_type&, state_type&, const double)> eqsir2(const Rcpp::NumericVector theta) {
return [&theta](const state_type &x, state_type &dxdt, const double t) {return;};
}
// no references
std::function<void(const state_type, state_type, const double)> eqsir(const Rcpp::NumericVector theta) {
return [&theta](const state_type x, state_type dxdt, const double t) {return;};
}