Чтобы сделать это как можно проще, скажем, ваши объекты - это списки с двумя элементами: именем и значением. Значение является числовым; это то, что мы хотим отсортировать. Вы можете представить, что у вас больше элементов и вам нужно что-то более сложное для сортировки.
Страница справки sort
сообщает, что sort
использует xtfrm
; xtfrm
, в свою очередь, говорит нам, что будет использовать методы ==
и >
для класса x[i]
.
Сначала я определю объект, который хочу отсортировать:
xx <- lapply(c(3,5,7,2,4), function(i) list(name=LETTERS[i], value=i))
class(xx) <- "myobj"
Теперь, поскольку xtfrm
работает с x[i]
, мне нужно определить функцию [
, которая возвращает нужные элементы, но все еще с правильным классом
`[.myobj` <- function(x, i) {
class(x) <- "list"
structure(x[i], class="myobj")
}
Теперь нам нужны функции ==
и >
для класса myobj
; потенциально это может быть умнее, если их правильно векторизовать; но для функции сортировки мы знаем, что мы будем передавать только myobj
длины 1, поэтому я просто буду использовать первый элемент для определения отношений.
`>.myobj` <- function(e1, e2) {
e1[[1]]$value > e2[[1]]$value
}
`==.myobj` <- function(e1, e2) {
e1[[1]]$value == e2[[1]]$value
}
Теперь sort
просто работает.
sort(xx)
Считается более правильным написать полную Ops
функцию для вашего объекта; однако, чтобы разобраться, это все, что вам нужно. См. Стр.89-90 в Venables / Ripley для более подробной информации о том, как сделать это, используя стиль S3. Кроме того, если вы легко можете написать для своих объектов функцию xtfrm
, это будет проще и, скорее всего, быстрее.