2
Rcppには、クラス内に非常に長いマップ構造を作成する関数があります。 Rcpp:オブジェクトを引数として呼び出す関数
#include <Rcpp.h>
using namespace Rcpp;
class A{
private:
std::map<int, int> m_map;
public:
void fill_map(const size_t limit){
for(size_t i=0; i<limit; ++i){
m_map[i] = i;
}
}
size_t size_map(){return m_map.size();}
};
// [[Rcpp::export]]
void func1(const size_t limit) {
A a;
a.fill_map(limit);
}
/* NOT WORKING */
// [[Rcpp::export]]
void func2(A a)
{
std::cout << a.size_map() << "\n";
}
/* NOT WORKING */
私は
func1(1e7)
を呼んで言って、
a
-objectでマップをいっぱいに:私は以下のことの簡単な例を与えてくれました。私はこの
A
を上記のように他の関数に
func2
で渡す必要があります。
ただし、func2
の例は機能しません。 Rcpp
フレームワーク内で、func2
を前の関数で定義されたオブジェクトで呼び出す正しい、最も効率的なアプローチは何ですか?
質問よりも複雑です。それはあなたがしたいことによって異なります。私はあなたのコードでC++レベルで 'A 'を構築し、その後Rレベルでそのオブジェクトを返さずにRレベルで後でそれを印刷することを理解しています。 'func1'は少なくとも' A'のポインタを返す必要があります。あなたが何をしたいのか、またその理由を具体的に記述してください。 – JRR
@JRRあなたは正しいです。オブジェクトは非常に大きいので、Rレベルに戻すのではなく、すべての操作が完了するまでC++レベルで保持します。 – BillyJean
私はそれほどうまく動作しないので、私はずっとあなたを助けることはできません。しかし基本的に 'func1'は' a'へのポインタを返す必要があります。 'a'は' new'で作成されなければなりません。そうでなければ 'func1'の終わりに破棄されます。 'func2'は' a'へのポインタを受け取らなければなりません。 'Rcpp'を使うと、外部ポインタクラスを探すことができます。 'a'は' new'で割り当てられるので、どこかで 'delete'する必要があります – JRR