Mis a jour le 2016-05-22, 16:22

Classes S3

Classes S3 : c'est la notion primitive des classes sous R.
Notion d'objet/classe en R :
Principes des classes S3 : Exemple :
getArea <- function(obj, scale = 1)
  UseMethod("getArea", obj)

getArea.default <- function(obj, scale = 1) {
  stop("Area not defined on any object")
}

getArea.circle <- function(obj, scale = 1) {
  return(scale * pi * obj[2] ^ 2)
}

getArea.rectangle <- function(obj, scale = 1) {
  return(scale * obj[1] * obj[2])
}

cir <- c(0, sqrt(10)); class(cir) <- "circle"
rec <- c(5, 6); class(rec) <- "rectangle"
squ <- c(3, 3); class(squ) <- c("square", "rectangle")

print(getArea(cir))
print(getArea(rec, 2))
print(getArea(squ))
Certaines fonctions sont déjà déclarées comme génériques : print(), length(), plot(), summary(), show() ...
C'est la méthode générique show qui appelée lorsque l'on affiche un objet (donc, si on veut changer l'apparence de l'affichage, il suffit de la redéfinir pour le type d'objet).
Examen des méthodes existantes :
inherits : teste si un objet hérite de l'une des classes mentionnées : inherits(obj, c("class1", "class2")) : renvoie TRUE si obj fait partie d'au moins l'une des classes mentionnées.
Exemple de définition d'une classe S3, incluant de l'opérateur overloading :
## Constructor
String <- function(s) {
  obj <- as.character(s)
  class(obj) <- "String"
  return(obj)
}

is.String <- function(obj) {
  return(class(obj) == "String")
}

## Generic defined
print.String <- function(obj) {
  return(paste("->", obj, "<-"))
}

## Generic defined
length.String <- function(obj) {
  return(nchar(obj))
}

## Generic
numberOfLetter <- function(obj, letter)
  UseMethod("numberOfLetter")

## Generic defined
numberOfLetter.String <- function(obj, letter) {
  return(length(grep(letter, unlist(strsplit(obj, "")))))
}

## Operator overloading
"+.String" <- function(obj1, obj2) {
  return(String(paste(obj1, obj2, sep = "")))
}

## Operator overloading
"[.String" <- function(obj, index) {
  return(unclass(substr(obj, index + 1, index + 1)))
}

s <- String("essai de classe")
print(s)
print(length(s))
print(numberOfLetter(s, "a"))
s2 <- String("s")
print(s + s2)
print(s[4])
renvoie :
[1] "-> essai de classe <-"
[1] 15
[1] 2
[1] "-> essai de classes <-"
[1] "i"

Copyright Aymeric Duclert
programmer en R, tutoriel R, graphes en R