IV. Quatrième partie - Annexes▲
IV-A. Annexe A - Remerciements▲
IV-A-1. Nous vivons une époque formidable▲
Quand on vit un moment historique, une révolution, une date clef, on ne s'en rend pas toujours compte. Je pense que la création d'Internet sera considérée par les historiens futurs comme une avancée majeure, quelque chose d'aussi énorme que l'invention de l'écriture ou l'imprimerie. L'écriture, c'est la conservation de l'information. L'imprimerie, c'est la diffusion de l'information à une élite, puis à tout le monde, mais avec un coût.
Internet, c'est l'instantanéité, la gratuité, le partage global, les connaissances des experts mises à la disposition de tous…. Les forums, c'est la fin des questions sans réponses….
Il y a quelque temps, je ne connaissais de la S4 que le nom. En quelques mois, j'ai pu acquérir des connaissances sérieuses grâce à des gens que je ne connais pas, mais qui m'ont aidé. Bien sûr, j'ai beaucoup lu. Mais dès que j'avais une question, je la posais le soir, je dormais du sommeil du juste et le lendemain matin, j'avais ma réponse. C'est gratuit, c'est de l'altruisme, c'est tout simplement merveilleux. Nous vivons une époque formidable !…
IV-A-2. Ceux par qui ce tutoriel existe…▲
Un grand merci donc à de nombreuses personnes dont certaines que je ne connais pas.
Pierre Bady, inestimable relecteur, m'a fait des remarques très pertinentes, en particulier sur la structure générale du document qui partait un peu dans tous les sens.… Martin Morgan, non seulement connaît TOUT sur la S4, mais de surcroît dégaine plus vite que son ombre quand il faut répondre à une question sur r-help…. Merci aussi à l'équipe du CIRAD qui anime le forum du Groupe des Utilisateurs de R. Jamais on ne se fait jeter, jamais le moindre RTFM ou GIYF(11). C'est cool. Bruno Falissard m'a donné (par ordre décroissant d'importance) une équipe(12), son amour de R, un thème de recherche, des idées, des contacts, un bureau, un ordi méga puissant… Sans lui, je serais sans doute encore en train de végéter dans une impasse. Merci à Scarabette pour ses avis, sa fraîcheur et son impertinence. Merci à Cathy et Michèle, mes deux chasseuses de fautes préférées. Enfin, merci à la R Core Team pour « the free gift of R ».…
IV-B. Annexe B - Mémo▲
Ça y est, vous avez tout lu, tout compris, vous êtes en train de programmer vos propres objets ? Juste un petit trou de mémoire : c'est quoi déjà le nom du troisième attribut de validObject ?
IV-B-1. Création▲
### Création de la classe
.NewClass.valid <-
function
(object){
return
(TRUE
)}
setClass
(
Class=
"NewClass"
,
representation
=
representation
(x=
"numeric"
,y=
"character"
),
prototype
=
prototype
(x=
1
,y=
"A"
),
contains =
c
("FatherClass"
),
validity =
.NewClass.valid
)
rm
(.NewClass.validity)
### Création d'un objet
new
(Class=
"NewClass"
)
A <-
new
(Class=
"NewClass"
, x=
2
, y=
"B"
)
A@
x <-
4
#(beurk !)
### Destruction d'une classe
removeClass
("NewClass"
)
### Constructeur
newClass <-
function
(){
return
(new
(Class=
"NewClass"
)) }
IV-B-2. Validation▲
.NewClass.initialize <-
function
(object, value){
if
(....) {
STOP("initialize(NewClass) : Erreur "
) }
else
{}
object@
x <-
value ; object@
y <-
value ^
2
;
validObject
(object)
return
(object)
}
setMethod
(f =
"initialize"
, signature
=
"NewClass"
,
definition =
.NewClass.initialize
)
rm
(.NewClass.initialize)
IV-B-3. Accesseur▲
>
### Getteur
>
setMethod
( f =
"["
, signature
=
"NewClass"
,
+
definition =
function
(object) {
return
(object@
x) }
+
)
>
### Setteur
>
setReplaceMethod
( f =
"["
, signature
=
"NewClass"
,
+
def =
function
(object, value) {
object@
x <-
value ; return
(object) }
+
)
IV-B-4. Méthodes▲
>
### Rendre une méthode générique
>
setGeneric
( f =
"newFunction"
,
+
def =
function
(z,r) {
standardGeneric
("newFunction"
) }
+
)
>
### Déclarer une méthode
>
setMethod
( f =
"newFunction"
,signature
=
"NewClass"
,
+
def =
function
(z,r) {
.... ; return
(....) }
+
)
>
### Pour connaitre les arguments d'une fonction
>
args
(NewFunction)
IV-B-5. Quelques fonctions incontournables▲
- args(print) : (x,...)
- args(show) : : (object)
- args(plot) : (x,y,...)
- args(summary) : (object,...)
- args(length) : (x)
IV-B-6. Voir la structure des objets▲
- slotNames("Trajectoires") : donne le nom des attributs de l'objet (mais pas leur type).
- getSlots("Trajectoires") : donne les attributs de l'objet et leur type.
- getClass("Trajectoires") : donne les attributs de l'objet, leur type, les héritiers et les ancêtres.
- getClass("Trajectoires",complete=FALSE) : donne les attributs de l'objet, les fils et le père uniquement.
- getMethod(f="plot",signature="Trajectoires") : donne la définition de plot pour l'objet Trajectoires (sans héritage).
- getMethods("plot") : donne la définition de plot pour toutes les signatures possibles.
- existsMethod(f="length",signature="Trajectoires") : retourne vrai si la méthode existe (sans d'héritage) pour la classe en question.
- selectMethod(f="length",signature="Trajectoires") : donne la définition de length pour l'objet Trajectoires (avec héritage).
- hasMethod("length", "Trajectoires") : retourne vrai si la méthode existe pour Trajectoires (avec héritage).
- showMethods("plot") : affiche toutes les signatures utilisables pour la méthode plot.
- showMethods(classes="Trajectoires") : affiche toutes les méthodes définies pour la classe Trajectoires
- findMethod("plot", "Trajectoires") : donne l'environnement dans lequel plot pour Trajectoires est défini.
IV-C. Annexe C - Pour aller plus loin▲
La littérature sur la S4 est assez sommaire, et pratiquement exclusivement en anglais. Voilà un petit aperçu de ce que l'on peut trouver :
- S4 Classes in 15 pages more or less [1] : Un bon tutoriel pour commencer ;
- S4 Classes and Methods [2] : comme précédemment, un tutoriel simple pour commencer ;
- S Programming [5] : le chapitre sur la S4 est court, mais il est assez clair ;
- A (Not so) Short Introduction to S4 : première version du livre que vous avez entre les mains ;
- Le Green Book présente également un chapitre sur la S4, mais il est un peu obscur…
Enfin, signalons l'existence d'un wiki dédié à la programmation S4 [6].