Rcpp поиск уникальных векторов символов

#rcpp

#rcpp

Вопрос:

Я изучаю Rcpp из книги Хэдли Уикхема Advance R: http://adv-r.had.co.nz/Rcpp.html .

Существует одно упражнение для реализации функции R unique() в Rcpp с использованием unordered_set (задача: сделать это в одну строку!). Решение находит уникальные числа в числовом векторе. Я пытаюсь найти уникальные символы в символьном векторе, используя второй фрагмент кода, который выдает ошибку. Есть какие-нибудь идеи о том, как выполнить эту простую функцию вручную? Спасибо!

 // [[Rcpp::export]]
    std::unordered_set<double> uniqueCC(NumericVector x) {
      return std::unordered_set<double>(x.begin(), x.end());
    }
    
    
    
    // [[Rcpp::export]]
    std::unordered_set<String> uniqueCC(CharacterVector x) {
      return std::unordered_set<String>(x.begin(), x.end());
    }
 

Ответ №1:

Для типов объектов, отсутствующих в библиотеке STL, вам необходимо определить свою собственную хэш-функцию. String (заглавная буква S) является объектом Rcpp.

Самый простой способ сделать это — использовать способность Rcpp преобразовывать в обычные объекты STL.

 // [[Rcpp::export]]
std::unordered_set<std::string> uniqueCC(CharacterVector x) {
  auto xv = Rcpp::as<std::vector<std::string>>(x);
  return std::unordered_set<std::string>(xv.begin(), xv.end());
}

> x <- sample(letters, 1000, replace=T)
> uniqueCC(x)
 [1] "r" "o" "c" "n" "f" "s" "y" "l" "i" "j" "m" "v" "t" "p" "u" "x" "w" "k" "g" "a" "d" "q" "z" "b" "h" "e"
 

В качестве альтернативы, вы можете взять вектор строки STL, а магия Rcpp сделает все остальное:

 // [[Rcpp::export]]
std::unordered_set<std::string> uniqueCC(const std::vector<std::string> amp; x) {
  return std::unordered_set<std::string>(x.begin(), x.end());
}