Ordenar vectores numéricos con nombre en Rcpp

8

En una función, quiero calcular valores numéricos, darles nombres y devolver un orden NumericVectoren Rcpp. Puedo ordenar los vectores (usando esto ), pero el orden de los nombres de los valores sigue siendo el mismo.

library(Rcpp)
x <- c(a = 1, b = 5, c = 3)
cppFunction('
NumericVector foo(NumericVector x) {
  std::sort(x.begin(), x.end());
  return(x);
}')
foo(x)
## a b c 
## 1 3 5 

Quiero que la función devuelva esto:

## a c b 
## 1 3 5 

¿Es posible? ¿Cómo puedo conseguir esto?

HBat
fuente
44
Por supuesto. Para una primera aproximación, debe determinar el orden de clasificación y usarlo para reindexar el atributo de nombres.
Dirk Eddelbuettel

Respuestas:

5

Utilizando la sugerencia que Dirk dio en su comentario, descubrí que los nombres de xes solo otro vector. Entonces, busqué ordenar un vector usando otro vector. Usando esta respuesta SO, se me ocurren las siguientes dos soluciones:

library(Rcpp)
x = c(a = 1, b = 5, c = 3, d = -3.2)

cppFunction('
NumericVector foo1(NumericVector x) {
 IntegerVector idx = seq_along(x) - 1;
 std::sort(idx.begin(), idx.end(), [&](int i, int j){return x[i] < x[j];});
 return x[idx];
}')

foo1(x)

##    d    a    c    b 
## -3.2  1.0  3.0  5.0 


cppFunction('
NumericVector foo2(NumericVector x) {
 IntegerVector idx = seq_along(x) - 1;
 //// Ordered indices based on x:
 std::sort(idx.begin(), idx.end(), [&](int i, int j){return x[i] < x[j];});
 //// Get the names of x:
 CharacterVector names_of_x = x.names();
 //// y vector is sorted x 
 NumericVector y = x[idx];
 //// Assign sorted names to y vector as names
 y.attr("names") = names_of_x[idx];
 return y;
}')

foo2(x)

##    d    a    c    b 
## -3.2  1.0  3.0  5.0 
HBat
fuente