Supponiamo che io ho la seguente matrice:In Rcpp - come restituire un vettore con i nomi
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
")))
Questa matrice ha i nomi delle colonne V1
-V6
Supponiamo che ci sia un'altra matrice dove ho rimuovere la colonna nome:
> testM2<-testM
> colnames(testM2)<-NULL
Poi se provo colMeans
su testM
e testM2
R ri trasforma una classe numeric
in entrambi i casi, tranne che nel primo caso la risposta è colnames
.
> 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
Ora supponiamo di avere la stessa funzione scritta in RCpp come segue:
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;
}
L'uscita per colMeansCppMt
sia per testM
e testM2
ritorno vettori numerici, ma quello per testM
non contiene il colnames
come non è stato impostato.
Ora, supponiamo che io cambio la funzione di colMeansCppMt
per includere attributi come questo:
//[[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;
}
L'uscita per testM
è ancora un vettore che non contiene i nomi delle colonne.
Ho anche provato out.attr("names")=x.attr("colnames")
e out.attr("colnames")=x.attr("colnames")
.
a). Come posso verificare in RCpp dove è stato impostato o no colnames
di una matrice (ad esempio x
nella funzione di esempio sopra)?
b). Come posso restituire un vettore numerico in R con i nomi in Rcpp?