如何使用Rcpp将C结构从C库暴露给R.

时间:2013-07-18 06:10:26

标签: r rcpp

我试图将C库中的C结构暴露给R.例如:

struct A {
    int flag;
    // ...
}

通常,库提供API来构造和销毁A

A* initA();
void freeA(A* a);

感谢RCPP_MODULE,很容易在不考虑析构函数的情况下公开它:

#include <Rcpp.h>

using namespace Rcpp;

RCPP_EXPOSED_CLASS(A)

RCPP_MODULE(A) {
  class_<A>("A")
  .field("flag", &A::flag)
  ;
}

//'@export
//[[Rcpp::export]]
SEXP init() {
  BEGIN_RCPP
  return wrap(*initA());
  END_RCPP
}

我喜欢这种方法,但它可能会导致内存泄漏,因为它在垃圾回收期间不会正确破坏A。在.finalizer(freeA)中添加RCPP_MODULE会导致free错误两次。

使用XPtr<A, freeA>可能是一个解决方案,但我需要手动定义要公开A.flag的函数。

一般来说,如何使用Rcpp将C结构从C库公开为R?

1 个答案:

答案 0 :(得分:1)

我建议你把你的C结构变成一个C ++类,它允许你在构造函数中分配并在析构函数中释放。

你仍然可以使用不同的方法在R和C ++之间轻松地进行类转换---模块是几种可能性之一。