假设我想实现一个计算唯一值的函数,例如
#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对象?或者,我怎么能使用这种对象的某些哈希来计算唯一值?
答案 0 :(得分:0)
我们在Rcpp Gallery上有一些示例,它们展示了如何基于运行时加载SEXP类型作为编译时RTYPE来进行动态运行时切换。
编译器无法知道您是使用整数还是数字调用...但是要插入的基于R的后端需要一个类型。我认为你可以用std::variant(C ++ 17)或Boost version来做你想做的事。
或者只是切换原子类型。