2014-06-24 12 views
5

Angenommen zurückzukehren habe ich die folgende Matrix:In RCPP - wie ein Vektor mit Namen

testM <- as.matrix(read.table(textConnection(" 
1 5 4 1 3 2 
2 1 5 4 1 3 
2 2 1 5 4 1 
3 2 2 1 5 4 
1 3 2 2 1 5 
4 1 3 2 2 1 
1 5 4 1 3 2 
2 1 5 4 1 3 
2 2 1 5 4 1 
3 2 2 1 5 4 
1 3 2 2 1 5 
4 1 3 2 2 1 
"))) 

Diese Matrix enthält Spaltennamen V1-V6

Angenommen, es gibt eine andere Matrix ist, wo ich die Spalte zu entfernen Name:

> testM2<-testM 
> colnames(testM2)<-NULL 

Dann, wenn ich colMeans auf testM und testM2 R re versuchen wird in beiden Fällen eine numeric Klasse, außer im ersten Fall hat die Antwort .

> colMeans(testM) 
     V1  V2  V3  V4  V5  V6 
2.166667 2.333333 2.833333 2.500000 2.666667 2.666667 
> colMeans(testM2) 
[1] 2.166667 2.333333 2.833333 2.500000 2.666667 2.666667 

Jetzt nehme ich die gleiche Funktion in RCPP geschrieben haben, wie folgt:

double do_mean(NumericVector x) { 
    return mean(na_omit(x)); 
} 

//[[Rcpp::export]] 
NumericVector colMeansCppMt(NumericMatrix& x) { 
    int nCols=x.ncol(); 
    NumericVector out=no_init(nCols); 
    for (int i=0;i<nCols;i++) { 
    NumericMatrix::Column tmp=x(_,i); 
    out[i]=do_mean(tmp); 
    } 
    return out; 
} 

Der Ausgang für colMeansCppMt für beide testM und testM2 Rückkehr numerische Vektoren, aber die eine für testM enthält nicht die colnames wie es nicht festgelegt wurde.

Nun nehme ich die colMeansCppMt Funktion ändern Attribute wie folgt umfassen:

//[[Rcpp::export]] 
NumericVector colMeansCppMt(NumericMatrix& x) { 
    int nCols=x.ncol(); 
    NumericVector out=no_init(nCols); 
    for (int i=0;i<nCols;i++) { 
    NumericMatrix::Column tmp=x(_,i); 
    out[i]=do_mean(tmp); 
    } 
    out.attr("names")=x.attr("names"); 
    return out; 
} 

Der Ausgang für testM ist nach wie vor ein Vektor, der nicht die Spaltennamen enthält.

Ich versuchte auch out.attr("names")=x.attr("colnames") und out.attr("colnames")=x.attr("colnames").

a). Wie kann ich RCpp einchecken, wo die colnames einer Matrix (z. B. x in der obigen Beispielfunktion) eingestellt wurde oder nicht?

b). Wie kann ich einen numerischen Vektor in R mit Namen in Rcpp zurückgeben?

Antwort

3

die Landschaft setzen:

  1. Regular R Vektoren haben ein (optional) names Attribut
  2. data.frame s row.names Attribut für Zeilen und names Attribut für Spalten und
  3. matrix s ein (optionales) dimnames Attribut haben; Dieses Attribut ist ein list enthält 2 Zeichen Vektoren (Zeilen und Spalten).

Also, was Sie wollen, ist die Spaltennamen von x an dem Attribut 'Namen' von out, so etwas wie:

out.attr("names") = VECTOR_ELT(x.attr("dimnames"), 1); 

funktionieren würde.

(Ich kann mich nicht erinnern, wenn Rcpp hat eine schöne API zum Abrufen/Festlegen von Dimensionsnamen in Arrays ...)