使用带有Rcpp的C ++类从C或R对其进行修改

问题描述 投票:0回答:2

我开始使用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", &parameters::changes)
  .method("print", &parameters::print)

  .field("val", &parameters::val)
  .field("mat", &parameters::mat)
  .field("n", &parameters::n)
  .field("dB", &parameters::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变量的对象。似乎制作一个类在某种程度上是一个很好的解决方案,因为我可以修改字段...

c++ r rcpp
2个回答
0
投票

Rcpp模块必须在R软件包中使用。 *Cpp()不适合处理出口。他们致力于使用Rcpp属性进行开发。


0
投票

找到了通过Rcpp模块公开C ++类的支持。

© www.soinside.com 2019 - 2024. All rights reserved.