Search code examples
randomcharacterrcpp

Rcpp sample sugar function, how to use


I am trying to permute the order of elements in a CharacterVector. In R I would simply use:

sample(charvec)

I am trying the same thing in Rcpp using the sample sugar function, but it keeps throwing 'error: no matching function for call to 'sample(Rcpp::CharacterVector&)'. Other sugar functions I have tried, like intersect or sort_unique work fine with CharacterVector, but sample refuses to work. This is the minimal example I have been experimenting with:

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

What I am doing wrong when trying to use the sample sugar function?


Solution

  • You are just missing the size parameter, which is mandatory for 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"
    

    UPDATE (about debugging this kind of errors): Admittedly, the error you see when you do not provide the size argument is kind of obscure (at least with gcc), but you can see:

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

    This is the error: no matching function. And then,

    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>&, int, bool, Rcpp::sugar::probs_t)’
      437 | sample(const Vector<RTYPE>& x, int size, bool replace = false, sugar::probs_t probs = R_NilValue)
          | ^~~~~~
    

    where gcc is showing you a candidate, and you can see that this function accepts a constant Vector of any RTYPE (numeric, character...), and then it needs a size argument, because there is no default. The others (replace, probs) do have a default. R functions may have missing arguments, C++ functions cannot.