将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
use a C++ class with Rcpp to modify it from C or R
我开始玩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
另外,我在这里看到我可能需要使用这两行:
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
(参数模块作为全局环境中的环境存在(。
所以,我的问题是:
1( 为什么函数 p$changes(( 不起作用
2( 我需要加载参数模块吗?它似乎没有改变任何东西...
谢谢!
支持通过您找到的 Rcpp 模块公开C++类。
同样在软件包中,不太为人所知,但由John Chambers本人添加的是Rcpp类,这是Rcpp模块的扩展,似乎正是您所要求的。
将 Rcpp 附带的完整示例包中的示例作为完整目录和测试。 包中还有文档。
有问题的方法的一个小版本解决了这个问题。我基本上犯了两个(愚蠢的(错误:
1(我没有返回一些东西,即使该函数应该返回一个数字向量(我很惊讶这个编译(
2( 我用 db[0] 而不是 db(0(
所以新编辑的函数是:
NumericVector changes(){
dB(0) = val;
dB(1) = 12;
//dB[1] = mean(mat(1,_));
return dB;
}
无外套和 Dirk,感谢您的回答,但似乎没有必要在包中使用它们(因为我所做的工作正常(。我错过了什么吗?
相关文章:
- 类与私有变量的其他类之间的线程安全性
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 为什么从另一个构造函数内部调用C++构造函数不修改类变量?
- 类与命名空间的全局实例
- C++类与C不同的文件
- 无法将 GTest 中的类与 CMake 链接
- 在 C++ 中,我可以在不修改类的情况下定义对类的隐式转换吗?
- 在 C++ 中从类外部修改类的成员
- 类与枚举类作为索引类型
- 让类与运算符一起工作更简单的方法
- 通过运算符使用标量参数重写来修改类成员
- 派生类 插入和提取运算符重载以及基类与派生类之间的强制转换
- 打印/修改类对象的特定成员变量,其类定义列表 (STL) 包含的元素类型
- 如何修改类及其方法,让我调用另一个类的必要方法?
- 类与朋友而不是前向声明,:哪个编译器是正确的
- 修改类 c++ 中的成员对象
- 将数据添加到现有类,而无需继承、映射或修改类
- 使用参考变量修改类私人变量
- 如何跟踪通过外部代码修改类变量的所有位置