C ライブラリから R に C 構造体を公開しようとしています。例:
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)
すると、 2 倍RCPP_MODULE
のエラーが発生します。free
を使用XPtr<A, freeA>
することで解決できるかもしれませんが、公開する関数を手動で定義する必要がありますA.flag
。
一般に、Rcpp を使用して C ライブラリから R に C 構造をどのように公開しますか?