对R中的非平凡元素列表进行排序

Chr*_*ris 10 sorting r

在R中,我有一个非常重要的对象列表(它们不是像R可以预期能够定义订单的标量的简单对象).我想对列表进行排序.大多数语言允许程序员提供比较传递给排序函数的一对列表元素的函数或类似函数.我怎样才能对列表进行排序?

Aar*_*ica 14

为了使这简单易行,可以说你的对象是带有两个元素的列表,一个名称和一个值.该值是数字; 这就是我们想要排序的东西.你可以想象有更多的元素,需要做一些更复杂的事情来排序.

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"
Run Code Online (Sandbox Code Playgroud)

现在,因为xtfrmx[i]s上工作,我需要定义一个[返回所需元素但仍然使用正确类的函数

`[.myobj` <- function(x, i) {
  class(x) <- "list"
  structure(x[i], class="myobj")
}
Run Code Online (Sandbox Code Playgroud)

现在我们需要==>功能为myobj班级; 通过正确地矢量化这可能会更聪明; 但是对于sort函数,我们知道我们只会传入myobj1的长度,所以我只使用第一个元素来定义关系.

`>.myobj` <- function(e1, e2) {
  e1[[1]]$value > e2[[1]]$value
}

`==.myobj` <- function(e1, e2) {
  e1[[1]]$value == e2[[1]]$value
}
Run Code Online (Sandbox Code Playgroud)

现在sort才行.

sort(xx)
Run Code Online (Sandbox Code Playgroud)

Ops为对象编写完整函数可能被认为更合适; 然而,只是排序,这似乎是你所需要的.有关使用S3风格执行此操作的更多详细信息,请参阅Venables/Ripley中的第89-90页.此外,如果您可以轻松地xtfrm为对象编写函数,那么这将更简单,更可能更快.