Функция сахара образца Rcpp, как использовать

#random #character #rcpp

Вопрос:

Я пытаюсь изменить порядок элементов в характеристике. В R я бы просто использовал:

 sample(charvec)
 

Я пытаюсь сделать то же самое в Rcpp, используя функцию sample sugar, но она продолжает выдавать «ошибка: нет соответствующей функции для вызова» sample(Rcpp::CharacterVectoramp;)». Другие функции сахара, которые я пробовал, например intersect , или sort_unique отлично работают с CharacterVector, но образец отказывается работать. Это минимальный пример, с которым я экспериментировал:

 cppFunction('CharacterVector samplefunc() {
  CharacterVector v = {"Cat", "Dog", "Fox", "Fish", "Lion"} ;
  CharacterVector v2 = sample(v) ;
  return v2 ;
}')
 

Что я делаю не так при попытке использовать функцию сахара-образца?

Комментарии:

1. Если позволите, попробуйте лучше использовать существующие решения. Если вы выполните поиск здесь со строкой (включая квадратные скобки) [rcpp] sample is:question , вы получите 221 (!!) другой вопрос, на который нужно обратить внимание. Уточните поиск по мере необходимости («образец» — это общий термин). Затем рассмотрите галерею Rcpp, где вы также можете выполнить поиск.

Ответ №1:

Вам просто не хватает size параметра, который является обязательным для Rcpp::sample :

 set.seed(42)

Rcpp::cppFunction('CharacterVector samplefunc() {
  CharacterVector v = {"Cat", "Dog", "Fox", "Fish", "Lion"} ;
  CharacterVector v2 = sample(v, v.size()) ;
  return v2 ;
}')

samplefunc()
#> [1] "Lion" "Fish" "Cat"  "Dog"  "Fox"
 

ОБНОВЛЕНИЕ (об отладке такого рода ошибок): Следует признать, что ошибка, которую вы видите, когда вы не предоставляете size аргумент, несколько неясна (по крайней мере, с gcc), но вы можете видеть:

 file1294a34f4734f.cpp: In function ‘Rcpp::CharacterVector samplefunc()’:
file1294a34f4734f.cpp:8:30: error: no matching function for call to ‘sample(Rcpp::CharacterVectoramp;)’
    8 |   CharacterVector v2 = sample(v) ;
      |                        ~~~~~~^~~
 

Это ошибка: нет функции сопоставления. И затем,

 In file included from /***/Rcpp/include/Rcpp/sugar/functions/functions.h:89,
                 from /***/Rcpp/include/Rcpp/sugar/sugar.h:31,
                 from /***/Rcpp/include/Rcpp.h:78,
                 from file1294a34f4734f.cpp:1:
/***/Rcpp/include/Rcpp/sugar/functions/sample.h:437:1: note: candidate: ‘template<int RTYPE> Rcpp::Vector<RTYPE, Rcpp::PreserveStorage> Rcpp::sample(const Rcpp::Vector<RTYPE, Rcpp::PreserveStorage>amp;, int, bool, Rcpp::sugar::probs_t)’
  437 | sample(const Vector<RTYPE>amp; x, int size, bool replace = false, sugar::probs_t probs = R_NilValue)
      | ^~~~~~
 

где gcc показывает вам кандидата, и вы можете видеть, что эта функция принимает Vector любую константу RTYPE (числовую, символьную…), а затем ей нужен size аргумент, потому что по умолчанию его нет. У других ( replace , probs ) есть значение по умолчанию. Функции R могут иметь отсутствующие аргументы, функции C не могут.