2013-07-01 13 views
9

içerisindeki öğelerine nasıl erişileceği şaşkın.Bir vektörün bir Rcpp :: List

aşağıdaki derlemek ve iyi çalışır: R ise

#include <Rcpp.h> 
using namespace Rcpp; 
// [[Rcpp::export]] 
List test(){ 
    List l; 
    IntegerVector v(5, NA_INTEGER); 
    l.push_back(v); 
    return l; 
} 

:

R) test() 
[[1]] 
[1] NA NA NA NA NA 

Ama listede IntegerVector ayarlamaya çalıştığınızda:

// [[Rcpp::export]] 
List test(){ 
    List l; 
    IntegerVector v(5, NA_INTEGER); 
    l.push_back(v); 
    l[0][1] = 1; 
    return l; 
} 

Gelmez derleme:

test.cpp:121:8: error: invalid use of incomplete type 'struct SEXPREC' 
C:/PROGRA~1/R/R-30~1.0/include/Rinternals.h:393:16: error: forward declaration of 'struct SEXPREC' 

cevap

15

Çünkü bu hattın geçerli:

l[0][1] = 1; 

derleyici l tamsayı vektörlerin bir liste olduğunu hiçbir fikri yok. Özünde l[0] size bir SEXP (tüm R nesneleri için genel tür) verir ve SEXP, te tanımına erişemediğimiz (bu nedenle opak) SEXPREC için opak bir işaretçidir. Yani, [1]'u yaptığınızda, ikinci SEXPREC'u almayı deniyorsunuz ve böylece opaklık bunu imkansız hale getiriyor ve bu zaten istediğin şey değil.

Sen bir IntegerVector ayıklanması olduğunu belli olmak zorunda, bu yüzden böyle bir şey yapabilirsiniz:

as<IntegerVector>(l[0])[1] = 1; 

veya

v[1] = 1 ; 

veya

IntegerVector x = l[0] ; x[1] = 1 ; 

Bunların hepsi seçenekler aynı temel veri yapısı üzerinde çalışır. Alternatif olarak, eğer l[0][1] sözdizimini gerçekten isterseniz, "tamsayı vektörlerinin listesi" ni ifade eden kendi veri yapınızı tanımlayabilirsiniz. İşte bir eskiz:

Kullanabileceğiniz, ör. Böyle:

// [[Rcpp::export]] 
List test2(){ 
    ListOf<IntegerVector> l = List::create(IntegerVector(5, NA_INTEGER)) ; 
    l[0][1] = 1 ; 
    return l; 
} 

Ayrıca (listeleri de dahil) .push_back Rcpp üzerinde vektörleri kullanarak yavaş aşağı neden olabilir liste verilerinin, tam bir kopyasını gerektirdiğini unutmayın. Sadece bir seçeneğiniz olmadığında yeniden boyutlandırma işlevlerini kullanın.

+1

Parfait! Cevabınız için çok teşekkür ederim ! – statquant

+0

Bir soru daha Romain, bir "Rcpp :: List" 'i içeren 'n' (örneğin 3)' std :: vektör 'veya' Rcpp :: IntegerVector' tek liner ile oluşturabilir ('ctor' olabilir), IntegerVector v (3, NA_INTEGER) gibi; Rcpp :: Liste testi (3, v) ' – statquant

+0

Bu çalışmayı amaçlamaktadır:' List l (3, TamsayıVektör (3, NA_INTEGER)) ', ancak dosyamızın birinde bir yazım hatası var (' fill__dispatch' gibi yazılmıştır fill_dispatch (bir alt çizgi)), bu yüzden başarısız olur. Yerel olarak düzelttim ve düzeltmeyi yakında gerçekleştireceğim. –

İlgili konular