4

我正在尝试将 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 中?

4

1 回答 1

2

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

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

于 2013-07-18T13:21:09.677 回答