如何将CPP类存储在R对象中
How to store CPP classe in R object?
我想知道是否有一种方法可以将CPP类存储在R对象中。
我知道我们可以调用R中的CPP函数,也可以调用CPP类的方法。
但我想在R对象中操作CPP类,我不知道这是否可能。
示例:
我在R脚本中调用此代码:
dyn.load(paste("X", .Platform$dynlib.ext, sep = ""))
.C("X_main")
函数X_main:
extern "C" {
void X_main () {
X x;
}
}
在X.cpp:中
X::X() { cout<<"constructor Xn"<<endl;}
我可以将类"X"的对象存储在R对象中吗?在存储的对象上使用类"X"的方法(在脚本中之后)?
或者,我可以在内存中存储一个类X的对象吗?我想用这个物体好几次。
通过编写转换器,您可以分配X
的组件,这些组件映射到类型R也知道:integer
、numeric
、character
。。。所有这些都是标量或矢量,当然还有它们的组合。
但你不是免费得到的。有了Rcpp和朋友们,我们有了所有的包装器——以及一堆构建工具——让这一切变得简单:
R> library(Rcpp)
R> cppFunction("arma::mat doubleIt(arma::mat X) { return 2*X; }",
+ depends="RcppArmadillo")
R> doubleIt(matrix(1:9,3))
[,1] [,2] [,3]
[1,] 2 8 14
[2,] 4 10 16
[3,] 6 12 18
R>
这里有900多个其他Rcpp问题,Rcpp画廊网站上有近100个工作示例。看看周围!
您可以在R中加载一个C++类(可能还有结构),它将变量保存在类范围内。R将C++类视为S4类。
在引擎盖下,会传递一个指向C++对象实例的指针,因此您可以在C++中创建一个对象实例,然后将其传递给R共享数据。
要了解如何做到这一点,它大约有7页,但非常值得一读,所以拿出一杯咖啡结账:用Dirk Eddelbuettel和Romain François的Rcpp模块展示C++函数和类。
pdf中的一个例子:
class Bar {
public:
Bar(double x_) : x(x_), nread(0), nwrite(0) {}
double get_x() {
nread++;
return x;
}
void set_x(double x_) {
nwrite++;
x = x_;
}
IntegerVector stats() const {
return IntegerVector::create(_["read"] = nread,
_["write"] = nwrite);
}
private:
double x;
int nread, nwrite;
};
RCPP_MODULE(mod_bar) {
class_<Bar>( "Bar" )
.constructor<double>()
.property( "x", &Bar::get_x, &Bar::set_x )
.method( "stats", &Bar::stats )
;
}
在R:中
Bar <- mod_bar$Bar
b <- new(Bar, 10)
b$x + b$x
b$stats()
b$x <- 10
b$stats()
相关文章:
- C++ 在堆栈中包含多态属性的类对象存储
- 将对象存储为其基本虚拟类
- 将大型对象存储在无序映射中是否效率低下
- C++:将未知类型的对象存储为成员变量的类
- 按unique_pointer将传递的对象存储在地图中
- 如何将 c++ 类对象存储为数组?
- 将对象存储在 std::map 中
- 是否存在对象存储在其生存期内可能会更改的情况?
- 将不同类型的对象存储在容器中
- 将自定义可绘制对象存储在数组中会导致绘制时出现分割错误
- 我将如何在C++中文件处理对象(存储/导入)
- 将对象存储在C 中的2维Sprite矩阵中
- 将抽象派生类对象存储在基类向量中
- 将任意函数对象存储到类成员容器中,而无需知道其声明签名
- 如何使用向量将类对象存储在超载操作员中
- 适当的方法将对象存储在Std矢量中
- 将向量对象存储在共享指针投掷错误中
- 将多态对象存储在unordered_set中
- 为什么我可以将对象存储在大小不同的数组中
- 返回对象存储在哪里