2012-10-04 9 views
11

Rのリストにx < -list(c(1,2,3)、c(4,5)、c(5,5)、c(6) )。私はリストをRcppに入力して平均ベクトルc(2、4.5、5、6)として返したいと思います。RのリストをRcppに処理する方法

Rcppでリストを処理する方法がわかりません。エラーメッセージが表示されるので、誰かが自分のコードをチェックできますか?

library(inline) 

fx = cxxfunction(signature(x='List'), body = 
' 
    Rcpp::List xlist(x); 
    int n = xlist.size(); 
    double res[n]; 

    for(int i=0; i<n; i++) { 
     Rcpp NumericVector y(xlist[i]); 
     int m=y.size(); 
     res[i]=0; 
     for(int j=0; j<m; j++){ 
      res[i]=res[i]+y[j] 
     } 
    } 

    return(wrap(res)); 
' 
, plugin='Rcpp') 

x<-list(c(1,2,3), c(4,5), c(5,5), c(6)) 
fx(x) 

答えて

21

ここで小さな誤差のカップル:

  1. 二つの構文エラー:あなたはyためRcpp::NumericVectorを必要とし、あなたは最後のループでのセミコロンを欠いています。
  2. C++の誤解の1つ:std::vector<double> res(n);のようなものが必要です。nはコンパイル時には分かりません。
  3. あなたはベクトルをリストからインスタンス化するにはあまりにも積極的/楽観的でした。私はこれを2つのステートメントで行いました。

このバージョンでは動作します:

R> fx <- cxxfunction(signature(x='List'), plugin='Rcpp', body = ' 
+  Rcpp::List xlist(x); 
+  int n = xlist.size(); 
+  std::vector<double> res(n); 
+         
+  for(int i=0; i<n; i++) {  
+   SEXP ll = xlist[i]; 
+   Rcpp::NumericVector y(ll); 
+   int m=y.size(); 
+   res[i]=0;   
+   for(int j=0; j<m; j++){  
+    res[i]=res[i]+y[j]; 
+   }  
+  } 
+  
+ return(Rcpp::wrap(res));  
+ ') 
R> x<-list(c(1,2,3), c(4,5), c(5,5), c(6)) 
R> fx(x) 
[1] 6 9 10 6  
R> 

編集:ここでははもう少し慣用であるバージョンです:

fx <- cxxfunction(signature(x='List'), plugin='Rcpp', body = ' 
    Rcpp::List xlist(x); 
    int n = xlist.size(); 
    Rcpp::NumericVector res(n); 

    for(int i=0; i<n; i++) { 
     SEXP ll = xlist[i]; 
     Rcpp::NumericVector y(ll); 
     for(int j=0; j<y.size(); j++){ 
      res[i] += y[j]; 
     } 
    } 

    return(res); 
') 
+0

はそんなにあなたに感謝を。 – user1690124

+0

私が喜んで、StackOverflowでよく見られるように、「受け入れ」(目盛りをクリック)と「upvote」(上向きの三角形をクリック)を自由に感じてください。 –

+0

このソリューションはこの特定のレベルのネストリストに対してのみ機能することを正しく理解していますか? –

関連する問題