4

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 構造をどのように公開しますか?

4

1 に答える 1

2

C 構造体を C++ クラスに変換して、コンストラクタで割り当て、デストラクタで解放することをお勧めします。

R と C++ の間でクラスを簡単に転送するには、さまざまな方法を使用できます --- モジュールはいくつかの可能性の 1 つです。

于 2013-07-18T13:21:09.677 に答える