我开始使用rcpp,我想创建一个可以在其中修改R或rcpp变量的对象。看起来创建类是一个不错的解决方案,因为我可以使用R中的'$'或直接使用Rcpp函数来修改字段。我的问题是,当我尝试使用类方法从rcpp修改类的变量时,R完全崩溃...
下面是一个小例子。该类包含一些不同类型的变量,以及一个构造函数和两个函数,一个用于打印值(以测试我做某事时是否确实进行了更改),另一个用于更改类的变量。]>
library(Rcpp) library(RcppArmadillo) # ODEs can also be described using Rcpp Rcpp::sourceCpp(code = ' #include <Rcpp.h> //#include <RcppArmadillo.h> using namespace Rcpp; // [[Rcpp::export]] class parameters{ public: NumericMatrix mat; double val; int n; NumericVector dB; parameters(double x): val(x) {} NumericVector changes(){ dB[0] = val; dB[1] = 12; //dB[1] = mean(mat(1,_)); } void print(){ Rcout << "val:" << std::endl << val << std::endl; Rcout << "mat:" << std::endl << mat << std::endl; } }; RCPP_MODULE(ParamModule){ using namespace Rcpp; class_<parameters>("parameters") .constructor<double>("constructor") .method("changes", ¶meters::changes) .method("print", ¶meters::print) .field("val", ¶meters::val) .field("mat", ¶meters::mat) .field("n", ¶meters::n) .field("dB", ¶meters::dB) ; } // [[Rcpp::export]] NumericMatrix addVal(NumericMatrix mat, double val, int n){ int i = 0; for (i=0; i<n; i++){ mat(i, 1) = mat(i,1) + val; } return mat; } ')
这是我用来测试的代码:
p = new(parameters,5) str(p) # constructor initialise the field val, ok p$mat = matrix(5, nrow = 5, ncol = 5) p$print() # field mat initialised, ok p$mat = matrix(0.1, nrow = 5, ncol = 5) p$print() # field mat changed, ok addVal(p$mat, 2, 5) p$print() # sounds like p is a pointer, ok p$changes() #...
最后一行是发生问题的地方(没有错误消息,因为R只是崩溃)。
当我编译该类时,我会收到此警告:
Warning message: No function found for Rcpp::export attribute at file215bf0ef501.cpp:8
而且,我看到here可能需要使用这两行:
ParamModule = Module("ParamModule") parameters = ParamModule$parameters
但是运行最后一个时,我收到一条错误消息:
Error in Module(module, mustStart = TRUE) : Failed to initialize module pointer: Error in FUN(X[[i]], ...): no such symbol _rcpp_module_boot_ParamModule in package .GlobalEnv
(ParamModule作为全局环境中的环境存在。
所以,我的问题是:
1)为什么函数p $ changes()不起作用
2)我需要加载paramModule吗?它似乎没有任何改变...
谢谢!
我开始使用rcpp,我想创建一个可以在其中修改R或rcpp变量的对象。似乎制作一个类在某种程度上是一个很好的解决方案,因为我可以修改字段...
Rcpp模块必须在R软件包中使用。 *Cpp()
不适合处理出口。他们致力于使用Rcpp属性进行开发。
找到了通过Rcpp模块公开C ++类的支持。