2017-10-23 1 views
0

Rcppモジュールを使用してクラスメソッドをエクスポートしています。これらのメソッドの中には、列挙型の戻り値の型を持つものがあります。例えば:私はコードをビルドしようとするとRcpp列挙型サポート

enum Polarization{ 
    HORIZONTAL_POL = 0, 
    VERTICAL_POL = 1 
}; 

が、私は次のエラーを取得する:

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

class EnumTest{ 
public: 
    EnumTest(){} 
    void setP(Polarization pol){p = pol;} 
    Polarization getP(){return p;} 
private: 
    Polarization p; 
}; 

RCPP_EXPOSED_CLASS(EnumTest) 
RCPP_MODULE(EnumTest){ 
    class_<EnumTest>("EnumTest") 
    .property("p", &EnumTest::getP, &EnumTest::setP) 
    ; 
} 

偏光は、次のように定義された列挙型、です。初期

の「偏光」に

変換することはできません「SEXPは、」あなたがクラスを公開する方法に類似Rcppに列挙し、公開するためにとにかくありますか?私は、Rcppモジュールのビネットで、enum型が将来の拡張の下にリストされていることに気づいた。これはこれを行う方法がないということですか?もしそうなら、可能性のある回避策がありますか?

答えて

2

マクロhereによって与えられるRcppの列挙型のサポートは限られています。

#include <Rcpp.h> 
using namespace Rcpp; 

enum Polarization{ 
    HORIZONTAL_POL = 0, 
    VERTICAL_POL = 1 
}; 

RCPP_EXPOSED_ENUM_NODECL(Polarization) 

class EnumTest{ 
    public: 
    EnumTest(){} 
    void setP(Polarization pol){p = pol;} 
    Polarization getP(){return p;} 
    private: 
    Polarization p; 
}; 


RCPP_MODULE(Bla){ 
    class_<EnumTest>("EnumTest") 
    .constructor() 
    .property("p", &EnumTest::getP, &EnumTest::setP) 
    ; 
} 

サポートは本当に基本的なものと基本的にクラスとすべてを失う、あなたはint型として列挙型を渡すことができます:

ですから、このような何かを行うことができます。時にはそれで十分です。コードをもっと明確にするために、R側で単純な名前付きリストを使用することをお勧めします。

Polarization <- list(HORIZONTAL_POL = 0L, VERTICAL_POL = 1L) 

などです。

test <- new(EnumTest) 
test$p <- Polarization$HORIZONTAL_POL 
names(which(test$p == Polarization)) 
## [1] "HORIZONTAL_POL" 
+0

オハイオ州、良い思い出、upvoted。それを完全に忘れてしまった。 "ある日"私たちは 'factor'型になるかもしれません:) –

0

文書として、R(我々は1が使用する/使用していること)への/からのみインタフェースは

SEXP .Call(yourFunction, SEXP a, SEXP b, SEXP c, ...) 

Rcppはに/ベースタイプからあなたのコンバータを与えています。しかし、あなたの列挙型はこれらの基底の一つではないので、独自のコンバータを書くか、渡す整数値を渡すだけです。