Rcpp可以公开一个C ++类方法,引用同一个类吗?

时间:2015-02-13 18:16:49

标签: c++ r rcpp

当类有成员获取该类的实例时,是否可以使用Rcpp将C ++类公开给R?

示例:

#include <Rcpp.h>

class Test {
public:
    Test(int x): x_(x) {}
    int getValue() { return x_; }
    void addValue(int y) { x_ += y; }
    void merge(const Test& rhs) { x_ += rhs.x_; }
private:
    int x_;
};

using namespace Rcpp;

RCPP_MODULE(mod_test) {

    class_<Test>("Test")

    .constructor<int>("sets initial value")

    .method("getValue", &Test::getValue, "Returns the value")
    .method("addValue", &Test::addValue, "Adds a value")
    .method("merge", &Test::merge, "Merges another Test into this object")
    ;
}

不幸的是,会导致以下错误:

  

错误:没有用于初始化&#39;测试&#39;

的匹配构造函数

在阅读并搜索答案后,我想出了包含RcppCommon.h的单独的成语,然后插入如下的块:

namespace Rcpp {
    template <> Test as( SEXP x ) ;
}

不幸的是,会导致以下错误:

  

dyn.load中的错误(&#34; /.../ sourceCpp_86871.so&#34;):无法加载   共享对象&#39; /.../ sourceCpp_86871.so&#39;:
  dlopen(/.../ sourceCpp_86871.so,6):未找到符号:   __ZN4Rcpp2asI4TestEET_P7SEXPREC引自:/... / sourceCpp_86871.so预期在:flat namespace in   /.../ sourceCpp_86871.so

是否可以这样做?

是否有&#39; as&#39;我需要创建的专业化?是否有一个如何写它的例子?

或者有一个例子,说明如何检查SEXP并将其转换回C ++对象&#34;包装&#34;?

1 个答案:

答案 0 :(得分:10)

通过插入as

,似乎可以生成正确的RCPP_EXPOSED_CLASS转换

完整的工作示例变为:

#include <Rcpp.h>

class Test {
public:
    Test(int x): x_(x) {}
    int getValue() { return x_; }
    void addValue(int y) { x_ += y; }
    void merge(const Test& rhs) { x_ += rhs.x_; }
private:
    int x_;
};

using namespace Rcpp;

RCPP_EXPOSED_CLASS(Test)
RCPP_MODULE(mod_test) {

    class_<Test>("Test")

    .constructor<int>("sets initial value")

    .method("getValue", &Test::getValue, "Returns the value")
    .method("addValue", &Test::addValue, "Adds a value")
    .method("merge", &Test::merge, "Merges another Test into this object")
    ;
}

现在可以正常使用:

> Rcpp::sourceCpp('test.cpp')
> a = Test$new(2)
> b = Test$new(3)
> a$getValue()
[1] 2
> a$merge(b)
> a$getValue()
[1] 5