rcpp示例糖功能,如何使用

Rcpp sample sugar function, how to use

我正在尝试排列 CharacterVector 中元素的顺序。在 R 中我会简单地使用:

sample(charvec)

我正在使用 sample 糖函数在 Rcpp 中尝试同样的事情,但它一直抛出“错误:没有匹配函数来调用 'sample(Rcpp::CharacterVector&)'”。我尝试过的其他糖功能,如 intersectsort_unique 与 CharacterVector 一起工作正常,但示例拒绝工作。这是我一直在试验的最小示例:

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

我在尝试使用示例糖功能时做错了什么?

您只是缺少 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"

UPDATE(关于调试此类错误):不可否认,当您不提供 size 参数时看到的错误有点晦涩(至少使用 gcc),但你可以看到:

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) ;
      |                        ~~~~~~^~~

这是错误:没有匹配的功能。然后,

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)
      | ^~~~~~

其中 gcc 向您展示了一个候选对象,您可以看到该函数接受任何 RTYPE(数字、字符...)的常量 Vector,然后它需要一个 size 参数,因为没有默认值。其他(replaceprobs)确实有默认值。 R 函数可能缺少参数,C++ 函数不能。