Méthodes

À toutes fins utiles je rappelle que, sur vecteur, la fonction rev fait ça :

> rev(1:3)
[1] 3 2 1

Maintenant, construisons une matrice :

rm(list=ls())
x <- matrix(1:9, 3, 3,, dimnames = list(LETTERS[1:3], month.abb[1:3]))

De telle sorte que :

> x
  Jan Feb Mar
A   1   4   7
B   2   5   8
C   3   6   9
> class(x)
[1] "matrix"
> mode(x)
[1] "numeric"

Si vous essayez rev sur x :

> rev(x)
[1] 9 8 7 6 5 4 3 2 1

Ce n'est pas ce que vous vouliez. Ce que vous auriez aimé, c'est que rev inverse l'ordre des lignes de votre matrice.

Bien sûr, vous pouvez créer une fonction ad hoc mais — si c’est vraiment ce que vous souhaitez — vous pouvez aussi modifier le comportement de rev sur les matrices. Voici comment faire :

rev.matrix <- function(x) x[nrow(x):1,, drop = FALSE]

Cette syntaxe generique.classe vous permet de créer une méthode pour rev sur la classe d'objet matrix. Une fois chargée en mémoire :

> rev(x)
  Jan Feb Mar
C   3   6   9
B   2   5   8
A   1   4   7

Et maintenant, créez une méthode pour rev sur la classe d'objet bidule qui fait la même chose mais sur l'ordre des colonnes :

rev.bidule <- function(x) x[, ncol(x):1, drop = FALSE]

Modifiez la classe de x :

class(x) <- "bidule"

Et testez :

> class(x)
[1] "bidule"
> mode(x)
[1] "numeric"
> rev(x)
  Mar Feb Jan
A   7   4   1
B   8   5   2
C   9   6   3

Fondamentalement, c'est à ça que servent les classes d'objets.

Aucun commentaire:

Enregistrer un commentaire