为了尽可能简单,假设您的对象是包含两个元素的列表,一个名称和一个值。该值是一个数字;这就是我们想要排序的。你可以想象有更多的元素并且需要做一些更复杂的排序。
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 类的== 和> 函数;通过适当地对它们进行矢量化,这可能会更智能;但是对于排序函数,我们知道我们只会传入长度为 1 的myobj,所以我将只使用第一个元素来定义关系。
`>.myobj` <- function(e1, e2) {
e1[[1]]$value > e2[[1]]$value
}
`==.myobj` <- function(e1, e2) {
e1[[1]]$value == e2[[1]]$value
}
现在sort 可以正常工作了。
sort(xx)
为您的对象编写完整的Ops 函数可能被认为更合适;然而,只是排序,这似乎是你所需要的。有关使用 S3 样式执行此操作的更多详细信息,请参见 Venables/Ripley 中的第 89-90 页。此外,如果您可以轻松地为您的对象编写 xtfrm 函数,那将更简单,而且很可能更快。