Rcppを初めて使用していて、文字ベクトル(myList
)と別の文字ベクトル(vec1
)のリストを取得する単純な関数を作成しようとしています。各リストベクトルとvec1の間。RをRcppで使用する
は、私は簡単に十分なRでこれを行うことができます。
myList <- list(
c('apple','banana','orange','pineapple'),
c('pear','pineapple','watermelon'),
c('orange','apple','pineapple'),
NA,
c('watermelon','lime','apple','banana'))
vec1 <- c('apple','pineapple','banana')
# R implementation
lapply(myList, function(x) intersect(x, vec1))
しかし、私はRcppでこれを実装する方法のように混乱しています。しかし、これはエラーになります...
cppFunction('
List intersectList (List input, StringVector vec) {
int n = input.size();
List out(n);
for (int i = 0; i < n; i++) {
StringVector sp = Rcpp::as< std::vector<std::string> > (input[i]);
if (sp.length() > 0) {
out[i] = intersect(sp, vec);
}
}
return out;
}
')
:ここに私の試みです
この特定のケースでError in sourceCpp(code = code, env = env, rebuild = rebuild, cacheDir = cacheDir, :
Error 1 occurred building shared library.
file1510d6dbd767c.cpp:14:17: error: no viable conversion from 'std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >' to 'StringVector' (aka 'Vector<16>')
StringVector sp = Rcpp::as< std::vector<std::string> > (input[i]);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:65:5: note: candidate constructor not viable: no known conversion from 'std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >' to 'const Rcpp::Vector<16, PreserveStorage> &' for 1st argument
Vector(const Vector& other){
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:73:5: note: candidate constructor not viable: no known conversion from 'std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >' to 'SEXP' (aka 'SEXPREC *') for 1st argument
Vector(SEXP x) {
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:101:5: note: candidate constructor not viable: no known conversion from 'std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >' to 'const std::string &' (aka 'const basic_string<char, char_traits<char>, allocator<char> > &') for 1st argument
Vector(const std::string& st){
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:107:5: note: candidate constructor not viable: no known conversion from 'std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >' to 'const char *' for 1st argument
Vector(const char* st) {
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:128:5: note: candidate constructor not viable: no known conversion from 'std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >' to 'const int &' for 1st argument
Vector(const int& size) {
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:133:5: note: candidate constructor not viable: no known conversion from 'std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >' to 'const Rcpp::Dimension &' for 1st argument
Vector(const Dimension& dims) {
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:78:5: note: candidate template ignored: could not match 'GenericProxy' against 'vector'
Vector(const GenericProxy<Proxy>& proxy){
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:123:42: note: candidate template ignored: disabled by 'enable_if' [with T = std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >]
typename Rcpp::traits::enable_if<traits::is_arithmetic<T>::value, void>::type* = 0) {
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:146:45: note: candidate template ignored: disabled by 'enable_if' [with T = std::__1::vector<std::__1::basic_string<char>, std::__1::allocator<std::__1::basic_string<char> > >]
typename Rcpp::traits::enable_if<traits::is_bool<T>::value && RTYPE == LGLSXP, void>::type* = 0) {
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:162:5: note: candidate template ignored: could not match 'VectorBase' against 'vector'
Vector(const VectorBase<RTYPE,NA,VEC>& other) {
^
/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include/Rcpp/vector/Vector.h:176:5: note: candidate template ignored: could not match 'SingleLogicalResult' against 'vector'
Vector(const sugar::SingleLogicalResult<NA,T>& obj) {
^
1 error generated.
make: *** [file1510d6dbd767c.o] Error 1
Rcppは必要ないかもしれないので、Rの実装は、シンプルで早いのが特長です。しかし、Rcppの実装を理解したいのは、ベクトルとリストをRcppで扱う方法をよりよく理解できるからです。
おかげで(1)! 私は純粋なRのバックグラウンドから来て、Rcpp(そしてC++はその点で問題ありません)に新しいです。これまでのところ、私はその違いについてはっきりしていません〜するtween StringVector、CharacterVector、std :: vectorのようになります。 しかし、これは正しい方向に私を向けるのに役立ちます!ありがとう! –
Pascal