Rcpp中的std :: RTYPE值集

时间:2017-08-28 09:29:28

标签: c++ rcpp

假设我想实现一个计算唯一值的函数,例如

#include <Rcpp.h>

using Rcpp::Vector;
using Rcpp::traits::is_na;
using Rcpp::IntegerVector;

template <int RTYPE>
IntegerVector nunique( const Vector<RTYPE>& x ) {
    std::set<typename Rcpp::traits::storage_type<RTYPE>::type> values;
    for ( int i = 0; i < x.length(); ++i ) {
      if ( !is_na<RTYPE>(x[i]) )
        values.insert(x[i]);
    }
    return IntegerVector::create(values.size());
}

然而,这不会编译并抛出错误,如:

error: call of overloaded 'insert(Rcpp::Vector<19>::const_Proxy)' is ambiguous
         values.insert(x[i]);

error: no match for 'operator<' (operand types are 'const Rcomplex' and 'const Rcomplex')
       { return __x < __y; }

有没有办法创建std::set RTYPE对象?或者,我怎么能使用这种对象的某些哈希来计算唯一值?

1 个答案:

答案 0 :(得分:0)

我们在Rcpp Gallery上有一些示例,它们展示了如何基于运行时加载SEXP类型作为编译时RTYPE来进行动态运行时切换。

编译器无法知道您是使用整数还是数字调用...但是要插入的基于R的后端需要一个类型。我认为你可以用std::variant(C ++ 17)或Boost version来做你想做的事。

或者只是切换原子类型。