gpt4 book ai didi

c++ - 使用带有 Rcpp 的 C++ 类从 C 或 R 修改它

转载 作者:行者123 更新时间:2023-12-01 14:43:25 25 4
gpt4 key购买 nike

我开始玩 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 模块公开 C++ 类的支持。

Rcpp 类也在包中,不太为人所知,但由 John Chambers 自己添加,它是 Rcpp 模块的扩展,它似乎正是您所要求的

complete example package that ships with Rcpp as a full directory and test中有示例.包中还有文档。

关于c++ - 使用带有 Rcpp 的 C++ 类从 C 或 R 修改它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60228160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com