Sắp xếp các vectơ số có tên trong Rcpp


8

Trong một hàm, tôi muốn tính toán các giá trị số, đặt tên cho chúng và trả về một sắp xếp NumericVectortrong Rcpp. Tôi có thể sắp xếp các vectơ (sử dụng cái này ), nhưng thứ tự tên của các giá trị vẫn giữ nguyên.

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 

Tôi muốn hàm trả về điều này:

## a c b 
## 1 3 5 

Có thể không? Làm thế nào tôi có thể đạt được điều này?


4
Chắc chắn rồi. Để gần đúng đầu tiên, bạn cần xác định thứ tự sắp xếp và sử dụng nó để giới thiệu lại thuộc tính tên.
Dirk Eddelbuettel

Câu trả lời:


5

Sử dụng mẹo mà Dirk đưa ra trong nhận xét của mình, tôi nhận ra rằng tên của xnó chỉ là một vectơ khác. Vì vậy, tôi đã tìm kiếm để sắp xếp một vectơ bằng cách sử dụng một vectơ khác. Sử dụng câu trả lời SO này tôi đưa ra hai giải pháp sau:

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.