2017-10-13 10 views
1

Rcppモジュールを使用してRにC++クラスを公開しようとしています。この動作の仕組みを理解するための簡単な例を作成しようとしました。私は自分のcppファイル、パッケージのsrcフォルダに格納されている2つのクラスBarとFooを持っています。 Bar.cppのコードは次のとおりです。Rcppモジュールを使用してC++クラスを公開する

#include "Bar.h" 
#include "Foo.h" 
#include <Rcpp.h> 
using namespace Rcpp; 

Bar::Bar(){x = 0;}; 

int Bar::getX(){return x;} 

void Bar::setX(int num){x = num;} 

int Bar::sumXY(){ 
    Foo f = Foo(); 
    f.setY(5); 
    return x + f.getY(); 
} 

RCPP_MODULE(bar_mod){ 
    class_<Bar>("Bar") 
    .constructor() 
    .method("getX", &Bar::getX) 
    .method("setX", &Bar::setX) 
    .method("sumXY", &Bar::sumXY) 
    ; 
} 

このヘッダーファイルのコードは次のとおりです。

class Bar{ 
public: 
    Bar(); 
    int getX(); 
    void setX(int num); 
    int sumXY(); 
private: 
    int x; 
}; 

Foo.cppのコードは次のとおりです。

#include "Foo.h" 
#include <Rcpp.h> 
using namespace Rcpp; 

Foo::Foo(){ 
    y = 0; 
} 

int Foo::getY(){return y;} 

void Foo::setY(int num){y = num;} 

RCPP_MODULE(foo_module){ 
    class_<Foo>("Foo") 
    .constructor() 
    .method("getY", &Foo::getY) 
    .method("setY", &Foo::setY) 
    ; 
} 

ヘッダーファイルのコードは次のとおりです。

class Foo{ 
public: 
    Foo(); 
    int getY(); 
    void setY(int num); 
private: 
    int y; 
}; 

Bar.cppファイルには、両方のヘッダーファイル(Bar.hとFoo.h)が含まれています。 BarのsetXY()メソッドは、Fooオブジェクトを作成し、そのメソッドを呼び出します(そのため、独自のファイル以外のクラスとメソッドを使用します)。

これらのクラスの両方からRでオブジェクトを作成し、それらのメソッドを呼びたいと思います。私は、次のコードを使用してRでこれらのモジュールをロードしようとしています:

require(Rcpp) 
loadModule("foo_mod", TRUE) 
loadModule("bar_mod", TRUE) 

foo_mod <- Module("foo_mod") 
bar_mod <- Module("bar_mod") 

foo <- new (Foo) 
bar <- new (Bar) 

はしかし、私は次のエラーを取得する:私は間違って何を

Error in .getClassesFromCache(Class) : object 'Foo' not found

やっていますか?

答えて

0

私はあなたの命名にちょっと迷っているかもしれないと思います。あなたができる後つまり私は

loadModule("foo", TRUE) 
loadModule("bar", TRUE) 

経由(パッケージには、これは重要です)

RCPP_MODULE(bar) // not bar_mod 
//... 
RCPP_MODULE(foo) // not foo_modules 

して、負荷を使用することになり、マクロRCPP_MODULE内の識別子のより一貫して使用してローダーを試してみてください(あなたがパッケージをロードした後、再度、これは必須です)

z <- new(foo) 

参照してください。例えば、私のRcppAnnoyパッケージを実行します。

関連する問題