rcpp示例糖功能,如何使用
Rcpp sample sugar function, how to use
我正在尝试排列 CharacterVector 中元素的顺序。在 R 中我会简单地使用:
sample(charvec)
我正在使用 sample
糖函数在 Rcpp 中尝试同样的事情,但它一直抛出“错误:没有匹配函数来调用 'sample(Rcpp::CharacterVector&)'”。我尝试过的其他糖功能,如 intersect
或 sort_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
参数,因为没有默认值。其他(replace
、probs
)确实有默认值。 R 函数可能缺少参数,C++ 函数不能。
我正在尝试排列 CharacterVector 中元素的顺序。在 R 中我会简单地使用:
sample(charvec)
我正在使用 sample
糖函数在 Rcpp 中尝试同样的事情,但它一直抛出“错误:没有匹配函数来调用 'sample(Rcpp::CharacterVector&)'”。我尝试过的其他糖功能,如 intersect
或 sort_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
参数,因为没有默认值。其他(replace
、probs
)确实有默认值。 R 函数可能缺少参数,C++ 函数不能。