В R как отсортировать массив объектов R6 - PullRequest
0 голосов
/ 06 октября 2018

Как я могу отсортировать / упорядочить объекты R6 на основе собственного значения функции или значения функции сравнения?

Я составил небольшой пример с прямоугольниками, которые я хотел бы отсортировать по их площади:

library('R6')

Rectangle <- R6Class(
  "Rectangle",
  public = list(
    initialize = function(width, height) {
      private$width = width
      private$height = height
    },
    get_area = function(){
      private$width*private$height
    }
  ),
  private = list(
    width = NULL,
    height = NULL
  )
)

array_of_rects = c( Rectangle$new(7,3), Rectangle$new(5,2), Rectangle$new(3,4))

Я хотел бы отсортировать array_of_rects по их площади, заданной функцией get_area().

Я пробовал разные вещи, такие как:

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

`==.Rectangle` <- function(e1, e2) {   e1[[1]]$get_area() == e2[[1]]$get_area() }

sort(array_of_rects)

, но без удачи(Я получаю сообщение об ошибке 'x' must be atomic).

Я пытался без [[1]] (например, e1$get_area()), но это тоже не сработало.

Обыскал, но убежал 'не нашел ничего, что привело бы меня к решению.

Есть предложения?Заранее спасибо!

1 Ответ

0 голосов
/ 06 октября 2018

Ну, вдохновленный https://stackoverflow.com/a/23647092/1935801

Я нашел следующее красивое и элегантное решение

area = function(rect){ rect$get_area() }
sorted_rects = array_of_rects[ order( sapply(array_of_rects, FUN = area) ) ]

В конце дня работает с R6, как и с любым другим классом / объектом.

...