2016-11-09 22 views
0

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で扱う方法をよりよく理解できるからです。

答えて

2

簡単に言えば:

  1. 機能がintersectと呼ばれています。あなたのタイトルはinterceptについて語っています。同じことではありません。

  2. intersect()の単体テストは1ライナーです(下記参照)。もし私があなただったら、それから始めて、StringVectorタイプで試してみよう。

  3. あなたはStringVectorstd::vector<std::string>の間でバクルして前にジャンプしています。どうして? StringVector sp = Rcpp::as< std::vector<std::string> > (input[i]);をのStringVectorに変更すると良いかもしれません。 [未検査、今は時間がない。ファイルunitTests/cpp/sugar.cppにRcppのすべてのバージョンに含ま]

テスト機能は、(次のとおりです。次のことを示唆ためのダークEddelbuettelへ

// [[Rcpp::export]] 
IntegerVector runit_intersect(IntegerVector x, IntegerVector y){ 
    return intersect(x, y) ; 
} 
+0

おかげで(1)! 私は純粋なRのバックグラウンドから来て、Rcpp(そしてC++はその点で問題ありません)に新しいです。これまでのところ、私はその違いについてはっきりしていません〜するtween StringVector、CharacterVector、std :: vector のようになります。 しかし、これは正しい方向に私を向けるのに役立ちます!ありがとう! – Pascal

0

ありがとう:

> 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<StringVector> (input[i]); 
+ 
+   if (sp.length() > 0) { 
+    out[i] = intersect(sp, vec); 
+   } 
+  } 
+ 
+  return out; 
+ 
+ } 
+ ') 
> 
> 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') 
> 
> intersectList(myList, vec1) 
[[1]] 
[1] "pineapple" "banana" "apple"  

[[2]] 
[1] "pineapple" 

[[3]] 
[1] "pineapple" "apple"  

[[4]] 
character(0) 

[[5]] 
[1] "banana" "apple" 
関連する問題