#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 не могут.