2017-11-05 31 views
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を前の関数で定義されたオブジェクトで呼び出す正しい、最も効率的なアプローチは何ですか?

+1

質問よりも複雑です。それはあなたがしたいことによって異なります。私はあなたのコードでC++レベルで 'A 'を構築し、その後Rレベルでそのオブジェクトを返さずにRレベルで後でそれを印刷することを理解しています。 'func1'は少なくとも' A'のポインタを返す必要があります。あなたが何をしたいのか、またその理由を具体的に記述してください。 – JRR

+0

@JRRあなたは正しいです。オブジェクトは非常に大きいので、Rレベルに戻すのではなく、すべての操作が完了するまでC++レベルで保持します。 – BillyJean

+0

私はそれほどうまく動作しないので、私はずっとあなたを助けることはできません。しかし基本的に 'func1'は' a'へのポインタを返す必要があります。 'a'は' new'で作成されなければなりません。そうでなければ 'func1'の終わりに破棄されます。 'func2'は' a'へのポインタを受け取らなければなりません。 'Rcpp'を使うと、外部ポインタクラスを探すことができます。 'a'は' new'で割り当てられるので、どこかで 'delete'する必要があります – JRR

答えて

2

C++コード

#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]] 
XPtr<A> func1(const size_t limit) 
{ 
    XPtr<A> ptr(new A(), true); 
    ptr->fill_map(limit); 
    return(ptr); 
} 

// [[Rcpp::export]] 
void func2(XPtr<A> ptr) 
{ 
    Rcout << ptr->size_map() << std::endl; 
} 

Rコード

a = func1(10) 
func2(a) 

aExternal pointerです。

関連する問題