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

Classes S4

Classes S4 : c'est la notion évoluée des classes sous R (voir classes S3 pour la comparaison entre les deux).
Définition d'une classe S4 :
setClass("Person",
         representation(firstname = "character", lastname = "character"),
         prototype(firstname = "Jean", lastname = "Dupond"),
         validity = function(object) { ## object : nom reserve !
           if (object@firstname == object@lastname)
             ## Person cannot have firstname equal to lastname
             return(FALSE)
           else
             return(TRUE)
         })
Attention, cela nécessite la librairie "methods" : mettre avant library(methods).
Définition d'une classe dérivée :
setClass("PersonWithAge",
         representation(age = "integer"),
         contains = "Person",
         validity = function(object) { ## object : nom reserve !
           if (object@firstname == object@lastname)
             ## Person cannot have firstname equal to lastname
             return(FALSE)
           else
             return(TRUE)
         })
Construction d'un objet :
Accès aux attributs de l'objet (slots) :
Méthode initialize :
setMethod("initialize",
          "Person",
          function(.Object, firstname, lastname) {
            print("initialize from Person called")
            .Object@firstname <- paste("Mr", firstname, sep = " ")
            .Object@lastname <- lastname
            validObject(.Object) ## valide l'objet
            return(.Object)
          })
Définition d'une méthode (qui ne modifie pas l'objet lui-même) :
Définition d'une méthode qui modifie un slot de l'objet :
Utilisation de méthodes d'indiçage :
On peut définir une méthode générique sans définir précisémment tous les arguments :
setGeneric("getComposedName",
           function(obj1, obj2, ...) {
             return(standardGeneric("getComposedName"))
           })
Méthode sur plusieurs objets et méthode qui dépend de la signature des objets donnés (choix exact de la méthode dépendra des objets donnés) :
setMethod("getComposedName",
          c(obj1 = "Person", obj2 = "Person"),
          function(obj1, obj2, separator) {
            return(paste(obj1@lastname, obj2@lastname, sep = separator))
          })

setMethod("getComposedName",
          c(obj1 = "character", obj2 = "Person"),
          function(obj1, obj2) {
            return(paste(obj1, obj2@lastname))
          })
Diverses méthodes pour récupérer des infos sur les classes et méthodes :

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