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?