Ответ 1
Чтобы сделать это так просто, я могу сказать, что ваши объекты представляют собой списки с двумя элементами, имя и значение. Значение - числовое; что мы хотим сортировать. Вы можете представить, что у вас больше элементов и нужно делать что-то более сложное для сортировки.
Страница справки 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
для своих объектов, это будет проще и, скорее всего, быстрее.