3 votes

Comment trier en R un tableau d'objets R6 ?

Comment trier/ordonner les objets R6 en fonction d'une valeur de fonction propre ou d'une valeur de fonction de comparaison ?

J'ai fait un petit exemple avec des rectangles que je voudrais trier par leur surface :

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))

Je voudrais trier array_of_rects par leur surface donnée par le get_area() fonction.

J'ai essayé différentes choses comme :

`>.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)

mais sans succès (j'obtiens un 'x' must be atomic message d'erreur).

J'ai essayé sans le [[1]] (comme ceci e1$get_area() ) mais cela n'a pas fonctionné non plus.

J'ai cherché partout, mais je n'ai rien trouvé qui me permette de trouver une solution.

Des suggestions ? Merci d'avance !

1voto

Morten Grum Points 356

Eh bien, inspiré par https://stackoverflow.com/a/23647092/1935801

J'ai trouvé la solution suivante, agréable et élégante

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

En fin de compte, cela fonctionne avec la R6 comme avec toute autre classe/objet.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X