Sortieren benannter numerischer Vektoren in Rcpp

8

In einer Funktion möchte ich numerische Werte berechnen, ihnen Namen geben und eine NumericVectorin Rcpp sortierte zurückgeben. Ich kann die Vektoren sortieren ( damit ), aber die Reihenfolge der Namen der Werte bleibt gleich.

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 

Ich möchte, dass die Funktion Folgendes zurückgibt:

## a c b 
## 1 3 5 

Ist es möglich? Wie kann ich das erreichen?

HBat
quelle
4
Sicher. In erster Näherung müssen Sie die Sortierreihenfolge bestimmen und damit das Attribut names neu indizieren.
Dirk Eddelbuettel

Antworten:

5

Mit dem Tipp, den Dirk in seinem Kommentar gab, fand ich heraus, dass die Namen von xnur ein weiterer Vektor sind. Also suchte ich nach einem Vektor mit einem anderen Vektor. Mit dieser SO-Antwort komme ich zu folgenden zwei Lösungen:

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
quelle