【问题标题】:Rcpp Enum SupportRcpp 枚举支持
【发布时间】:2017-10-23 18:46:35
【问题描述】:

我正在使用 Rcpp 模块来导出类方法。其中一些方法的返回类型是枚举。例如:

#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)
  ;
}

极化是一个枚举,定义如下:

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

当我尝试构建代码时,出现以下错误。

无法在初始化中将 'SEXP' 转换为 'Polarization'

是否有向 Rcpp 公开枚举,类似于公开类的方式?我在 Rcpp 模块小插图中注意到枚举类型列在未来扩展中。这是否意味着没有办法做到这一点?如果是这样,是否有任何可能的解决方法?

【问题讨论】:

    标签: c++ r enums rcpp


    【解决方案1】:

    Rcpp 中对枚举的支持有限,由宏 here 提供。

    所以你可以这样做:

    #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)
      ;
    }
    

    支持非常基础,本质上允许您将枚举作为整数传递,从而丢失类和所有内容。有时就足够了。我建议在 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"
    

    【讨论】:

    • 哦,好提醒,点赞。完全忘记了这一点。 “有一天”我们甚至可能会到达factor 类型:)
    【解决方案2】:

    如文档所述,唯一从/到 R 的接口(我们使用/应该使用)是

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

    Rcpp 为您提供与基本类型之间的转换器。但是您的 enum 不是这些 base 之一,因此您必须编写自己的转换器,或者只传递会通过的整数值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-03
      • 2016-10-26
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      相关资源
      最近更新 更多