Introduction aux classes S3, S4 et référence en R
Introduction aux classes S3, S4 et référence en R
appels de fonction. Cela doit être gardé à l'esprit lors de son utilisation pour résoudre de grands problèmes.
Un objet est une structure de données ayant des attributs et des méthodes qui agissent sur celui-ci.
attributs.
La classe est un modèle pour l'objet. Nous pouvons penser à la classe comme à un croquis (prototype) d'un
maison. Elle contient tous les détails sur les étages, les portes, les fenêtres, etc. Basé sur
ces descriptions nous construisons la maison.
La maison est l'objet. Comme on peut créer plusieurs maisons à partir d'une description, nous pouvons
créer plusieurs objets à partir d'une classe. Un objet est également appelé une instance d'une classe et
le processus de création de cet objet s'appelle l'instanciation.
Alors que la plupart des langages de programmation ont un système de classes unique, R a trois classes.
systèmes. À savoir, S3, S4 et plus récemment les systèmes de classe de référence.
Ils ont leurs propres caractéristiques et particularités et choisir l'un plutôt que l'autre est un
question de préférence. Ci-dessous, nous donnons une brève introduction à ceux-ci.
Classe S3
La classe S3 est quelque peu primitive par nature. Elle manque d'une définition formelle et d'un objet.
Une classe peut être créée simplement en ajoutant un attribut de classe à celle-ci.
Cette simplicité explique le fait qu'il est largement utilisé dans la programmation R.
langue. En fait, la plupart des classes intégrées de R sont de ce type.
Exemple 1 : classe S3
> Créer une liste avec les composants requis
> s <- list(name ="John", age =21, GPA =3.5)
>classe(s) <-"étudiant"
Classe S4
La classe S4 est une amélioration par rapport à la classe S3. Elles ont une définition formelle.
une structure qui aide à rendre les objets de la même classe plus ou moins similaires.
Exemple 2 : classe S4
< setClass("étudiant", slots=list(nom="caractère", âge="numérique",
GPA="numeric"))
Classe de référence
La classe de référence a été introduite plus tard, par rapport aux deux autres. Elle est plus similaire
à la programmation orientée objet à laquelle nous sommes habitués à voir dans d'autres grands
langages de programmation.
Les classes de référence sont essentiellement des classes S4 avec un environnement ajouté.
Comparaison entre S3 et S4
Classe de référence
Les objets sont créés par Les objets sont créés Les objets sont créés en utilisant
définir l'attribut de classe en utilisantnouveau() fonctions génératrices
Les méthodes appartiennent au générique Methods belong to Les méthodes appartiennent à la classe
fonction fonction générique
Suit le principe de la copie sur modification Suit la copie lors de la modification Ne suit pas la copie sur modification
sémantique sémantique sémantique
Classe R S3
Dans cet article, vous apprendrez à travailler avec les classes S3 (l'une des trois classes
systèmes en R).
La plupart des classes qui viennent prédéfinies dans R sont de ce type. Le fait que ce soit
simple et facile à mettre en œuvre est la raison derrière cela.
Fondamentalement, une liste avec son attribut de classe défini sur un nom de classe est un objet S3.
Les composants de la liste deviennent les variables membres de l'objet.
Voici un exemple simple de la façon dont un objet S3 de la classe étudiant peut être créé.
>class(es) <-"étudiant"
s
$nom
John
$age
21
$GPA
3,5
attr(,"classe")
étudiant
Cela pourrait sembler gênant pour les programmeurs venant de C++, Python, etc. où
il existe des définitions de classe formelles et les objets ont des attributs correctement définis
méthodes.
Dans le système R S3, c'est assez ad hoc. Vous pouvez convertir la classe d'un objet selon
votre volonté avec des objets de la même classe ayant des apparences complètement différentes. Tout dépend de vous.
Cela apportera une certaine uniformité dans la création d'objets et les rendra similaires.
Nous pouvons également ajouter un contrôle d'intégrité sur les attributs des membres. Voici un
exemple. Notez que dans cet exemple, nous utilisons leattr()fonction pour définir la classe
attribut de l'objet.
étudiant <-fonction(n,a,g) {
nous pouvons ajouter nos propres vérifications d'intégrité
attr(value,"class") <-"étudiant"
valeur
}
>s
$nom
Paul
$age
26
$GPA
3.7
attr(,"classe")
étudiant
classe(s)
étudiant
> Ces vérifications d'intégrité ne fonctionnent que lors de la création de l'objet en utilisant
constructeur
s <- étudiant("Paul",26,2.5)
s
$name
Paul
$age
26
$GPA
3.7
attr(,"classe")
étudiant
De plus, nous pouvons utiliserimprimer()avec des vecteurs, des matrices, des cadres de données, des facteurs, etc. et
Ils sont imprimés différemment selon la classe à laquelle ils appartiennent.
Comment est-ce queprint()savoir comment imprimer cette variété d'objets aux apparences différentes ?
La réponse est,imprimer()est une fonction générique. En fait, elle a une collection d'un certain nombre
des méthodes. Vous pouvez vérifier toutes ces méthodes avecméthodes(imprimer).
> méthodes(print)
[1][Link]*
[2][Link]*
...
[181][Link]*
[182][Link]*
Si nous avions fait la même chose avec un facteur, l'appel serait envoyé à[Link]().
Ici, nous pouvons observer que les noms des méthodes sont dans le
formegeneric_name.class_name()C'est ainsi que R est capable de déterminer quelle méthode utiliser.
appel en fonction de la classe.
print.étudiant <-fonction(obj) {
cat(obj$name, "\n")
chat(obj$âge,"ans ")
cat("Moyenne pondérée cumulative:", obj$GPA,"\n")
}
Maintenant, cette méthode sera appelée chaque fois que nousimprimer()un objet de la classe "étudiant".
Dans le système S3, les méthodes n'appartiennent ni à un objet ni à une classe, elles appartiennent à un générique.
Les fonctions. Cela fonctionnera tant que la classe de l'objet est définie.
>s
Paul
26 ans
GPA:3.7
déclassement
$name
Paul
$age
[1]26
$GPA
3.7
>impression
fonction(x, ...)
UseMethod("imprimer")
<bytecode:0x0674e230>
<environnement:nom_de_espace:base>
> tracer
fonction(x, y, ...)
Utiliser la méthode "plot"
<bytecode:0x04fe6574>
<environnement:nom_de_système:graphismes>
Nous pouvons voir qu'ils ont un seul appel àUtiliserMéthode()with the name of the generic
fonction passée à cela. C'est la fonction de répartition qui gérera tout le
Détails de contexte. Il est aussi simple que cela de mettre en œuvre une fonction générique.
grade <-fonction(obj) {
UtiliserMéthode("grade")
}
Une fonction générique est inutile sans méthode. Mettons en œuvre le défaut.
méthode.
[Link]<-function(obj) {
cat("C'est une fonction générique\n")
}
Maintenant, créons une méthode pour notre classe "étudiant".
[Link] <-fonction(obj) {
cat("Votre note est", obj$GPA, "\n")
}
Un exemple d'exécution.
note(s)
Votre note est de 3,7
De cette manière, nous avons implémenté une fonction générique appeléenoteet plus tard une méthode pour
notre classe.
Classe R S4
Dans ce cours, vous apprendrez tout sur les classes S4 en R ; comment les définir,
créez-les, accédez à leurs emplacements et utilisez-les efficacement dans votre programme.
Contrairement aux classes et objets S3 qui manquent de définition formelle, nous regardons la classe S4.
qui est plus stricte dans le sens où elle a une définition formelle et une manière uniforme de
créer des objets.
Cela ajoute de la sécurité à notre code et nous empêche de faire des erreurs naïves par accident.
erreurs.
Dans la terminologie R, les variables membres sont appelées emplacements. Lors de la définition d'une classe, nous avons besoin
pour définir le nom et les emplacements (ainsi que la classe de l'emplacement) qu'il aura.
Exemple 1 : Définition de la classe S4
setClass("étudiant", slots=list(nom="caractère", âge="numérique",
GPA="numeric"))
Dans l'exemple ci-dessus, nous avons défini une nouvelle classe appeléestudentavec trois emplacements
ça va avoirnom, âgeetMoyenne Générale.
Il existe d'autres arguments optionnels desetClass()que vous pouvez explorer dans l'aide
section avec?setClass.
>s
Un objet de la classe "étudiant"
Slot"name":
Jean
Slot"age":
21
Slot"GPA":
3.5
isS4(s)
VRAI
Cette fonction génératrice (ayant généralement le même nom que la classe) peut être utilisée pour
créer de nouveaux objets. Cela agit comme un constructeur.
> student <- setClass("student", slots=list(name="character",
age="numeric", GPA="numeric"))
étudiant
fonction de génération de classe pour la classe ‚étudiant‘ du paquet
.GlobalEnv
fonction(...)
nouveau("étudiant", ...)
Note above that our constructor in turn uses the nouveau()fonction pour créer des objets. C'est
juste un enveloppement.
Slot"age":
21
Slot"GPA":
3.5
Accéder au créneau
> s@name
John
> s@GPA
3.5
> âge
21
>s
Un objet de la classe "étudiant"
Slot"name":
"Jean"
Slot"age":
21
Slot"GPA":
3.7
> emplacement(s,"nom")
[1]"John"
>s
Un objet de la classe "étudiant"
Slot"name":
Paul
Slot"age":
21
Slot"GPA":
3.7
Vous pouvez lister toutes les fonctions et méthodes génériques S4 disponibles, en utilisant le
fonctionshowMethods().
montrerMéthodes()
Fonction : - (paquet de base)
Vous pouvez voir cette fonction dans la liste ci-dessus. Cette fonction est l'analogie S4 de la
S3imprimer()fonction.
> estS4(montrer)
VRAI
Nous pouvons lister toutes les méthodes de la fonction générique show en utilisantmontrerMéthodes(montre).
> showMethods(show)
Function: show (packagemethods)
object="ANY"
object="classGeneratorFunction"
...
object="standardGeneric"
(inheritedfrom:object="genericFunction")
object="traceable"
Par exemple, nous pouvons mettre en œuvre notre méthode de classe pour lemontrer()générique comme suit.
setMethod("show",
étudiant
fonction(objet) {
chat(object@name," ")
chat(object@age,"ans ")
cat("Moyenne Générale :", object@GPA, "\n")
}
)
Maintenant, si nous écrivons le nom de l'objet en mode interactif comme auparavant, le ci-dessus
le code est exécuté.
De cette manière, nous pouvons écrire nos propres méthodes de classe S4 pour les fonctions génériques.
Classe Référence R
Dans cela, vous apprendrez à travailler avec la classe de référence qui est l'une des trois
systèmes de classe (les deux autres sont S3 et S4).
La classe de référence en programmation R est similaire à la programmation orientée objet.
sont utilisés pour voir dans des langages courants comme C++, Java, Python, etc.
Contrairement aux classes S3 et S4, les méthodes appartiennent à la classe plutôt qu'aux fonctions génériques.
Les classes de référence sont implémentées en interne comme des classes S4 avec un environnement.
ajouté à cela.
> setRefClass("étudiant")
Les variables membres d'une classe, si elles sont définies, doivent être incluses dans la définition de la classe.
Les variables membres de la classe de référence sont appelées champs (analogues aux emplacements dans S4)
classes).
>s
Objet de classe "étudiant" de la classe Referenceclass
Field"name":
Jean
Field"age":
21
Field"GPA":
3.5
> s$name
[1]"John"
> s$age
21
> s$GPA
3.5
>s
Objet de la classe de référence "étudiant"
Field"name":
Paul
Field"age":
21
Field"GPA":
3.5
Note d'avertissement :
Dans le langage R, les objets sont copiés lorsqu'ils sont assignés à une nouvelle variable ou passés à un
fonction (passage par valeur). Par exemple.
# modifier b
> b$y =3
a reste inchangé
a
$x
[1]1
$y
[1]2
b
$x
1
$y
[1]3
Mais ce n'est pas le cas avec les objets de référence. Il n'existe qu'une seule copie et tout
les variables font référence à la même copie. D'où le nom, référence.
b
Objet de classe "étudiant" de la classe Referenceclass
Field"name":
Paul
Field"age":
21
Field"GPA":
3.5
Cela peut provoquer des modifications indésirables des valeurs et être la source de bugs étranges.
Nous devons garder cela à l'esprit en travaillant avec des objets de référence. Pour faire une copie,
nous pouvons utiliser lecopier()méthode mise à notre disposition.
> modifier b
> b$name <-"Paul"
a reste inchangé
a
Référence de l'objet de la classe "étudiant"
Field"name":
Jean
Field"age":
21
Field"GPA":
3.5
>b
Objet de classe référence "étudiant"
Field"name":
Paul
Field"age":
21
Field"GPA":
3.5
Méthodes de référence
Les méthodes sont définies pour une classe de référence et n'appartiennent pas aux fonctions génériques comme
dans les classes S3 et S4.
Toutes les classes de référence ont des méthodes prédéfinies car elles sont toutes héritées.
de la superclasseenvRefClass.
étudiant
Generatorfor class"student":
Classfields:
Class Methods:
"callSuper","copy","export","field","getClass",
"getRefClass",
"import","initFields","show","trace","untrace","usingMethods"
Superclasses de référence :
envRefClass
Nous pouvons voir des méthodes de classe commecopier(), champ()etshow()dans la liste ci-dessus. Nous pouvons
create our own methods for the class.
Cela peut être fait lors de la définition de la classe en passant une liste de définitions de fonctions.
àméthodesargument desetRefClass().
Dans la section ci-dessus de notre code, nous avons défini deux méthodes.
appeléinc_age()etdec_age()Ces deux méthodes modifient le champâge.
Notez que nous devons utiliser l'opérateur d'affectation non local.<<-puisque l'âge n'est pas dans le
l'environnement local de la méthode. C'est important.
> s$inc_age(5)
s$âge
[1]26
s$dec_age(10)
> s$age
16
Héritage R
Dans ce cours, vous apprendrez tout sur l'héritage en R. Plus précisément, comment
créer l'héritage dans les classes S3, S4 et Reference, et les utiliser efficacement dans
votre programme.
Une des fonctionnalités les plus utiles d'un langage de programmation orienté objet est
héritage.
Defining newclassesout of existing ones. This is to say, we can derive new classes
à partir des classes de base existantes et en ajoutant de nouvelles fonctionnalités. Nous n'avons pas besoin d'écrire à partir de
Par conséquent, l'héritage offre une réutilisabilité du code.
L'héritage forme une hiérarchie de classes tout comme un arbre généalogique. Il est important de noter que
que les attributs définis pour une classe de base seront automatiquement présents dans la classe dérivée
classe.
Ci-dessous, nous discutons de la manière dont l'héritage est effectué pour les trois différents systèmes de classes.
dans le langage de programmation R.
Cependant, la classe dérivée hérite des méthodes définies pour la classe de base. Supposons que
nous avons une fonction qui crée de nouveaux objets de la classeétudiantcomme suit.
étudiant <-fonction(n,a,g) {
value <- list(name=n, age=a, GPA=g)
attr(value, "class") <- "étudiant"
valeur
}
De plus, nous avons une méthode définie pour la fonction génériqueimprimer()comme suit.
[Link] <-fonction(obj) {
chat(obj$name," ")
chat(obj$age, "ans ")
cat("Moyenne Pondérée:", obj$GPA,"\n")
}
Imprimez-le
>s
Jean
21 ans
GPA:3.5
Nous pouvons voir ci-dessus que, puisque nous n'avons défini aucune méthode de la
[Link](), la méthodeimprimer étudiant()a été appelé. Cela
méthode de classeétudianta été hérité.
Définissons [Link]().
[Link]<-function(obj) {
cat(obj$name, "est de", obj$country, "\n")
}
>s
John vient de France
est(s,"étudiant")
VRAI
setClass("étudiant",
slots=list(name="character", age="numeric", GPA="numeric")
)
setMethod("show",
étudiant
function(objets) {
cat(object@name, "\n")
chat(object@age,"ans ")
chat("GPA:", objet@GPA, "\n")
}
)
hériter de l'étudiant
setClass("ÉtudiantInternational",
slots=list(country="character"),
contains="student"
)
spectacles
Jean
21 ans
GPA:3.5
Nous voyons que la méthode est définie pour la classeétudianta été appelé quand nous l'avons faitmontre(s).
Nous pouvons définir des méthodes pour la classe dérivée qui remplaceront les méthodes de la
classe de base, comme dans le cas des systèmes S3.
Nous allons maintenant hériter de cette classe. Nous réécrivons égalementdec_age()méthode pour ajouter un
vérification d'intégrité pour s'assurerâgeis never negative.
InternationalStudent<- setRefClass("InternationalStudent",
fields=list(country="character"),
contains="student",
methods=list(
dec_age = fonction(x) {
si((âge - x)<0) arrêter("L'âge ne peut pas être négatif")
âge <<- âge - x
}
)
)
> s$dec_age(5)
s$âge
16
> s$dec_age(20)
Erreur dans $dec_age(20) : L'âge ne peut pas être négatif
> s$age
16