我试图将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?
答案 0 :(得分:1)
我建议你把你的C结构变成一个C ++类,它允许你在构造函数中分配并在析构函数中释放。
你仍然可以使用不同的方法在R和C ++之间轻松地进行类转换---模块是几种可能性之一。