如何将CPP类存储在R对象中

How to store CPP classe in R object?

本文关键字:对象 存储 CPP      更新时间:2023-10-16

我想知道是否有一种方法可以将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也知道:integernumericcharacter。。。所有这些都是标量或矢量,当然还有它们的组合。

但你不是免费得到的。有了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()