145 votes

Que signifie "méthodes S3" en R ?

Comme je suis relativement nouveau dans R, je ne sais pas ce que sont les méthodes et les objets S3. J'ai découvert qu'il existe des systèmes d'objets S3 et S4, et certains recommandent d'utiliser S3 plutôt que S4 si possible (voir le guide de style R de Google à l'adresse suivante http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html )*. Cependant, je ne connais pas la définition exacte des méthodes/objets S3.

Mise à jour : à partir de 2019, l'hyperlien du Guide de style R de Google est maintenant aquí .

95voto

Nick Sabbe Points 6741

La plupart des informations pertinentes peuvent être trouvées en consultant les sites suivants ?S3 o ?UseMethod mais en résumé :

S3 fait référence à un schéma de répartition des méthodes. Si vous avez utilisé R pendant un certain temps, vous aurez remarqué qu'il y a print , predict y summary pour de nombreux types d'objets différents.

Dans S3, cela fonctionne de la manière suivante :

  • définir la classe des objets d'intérêt d'intérêt (par exemple : la valeur de retour d'un appel à une méthode glm a une classe glm )
  • fournir une méthode avec le nom général général (par exemple print ), puis un point, et puis le nom de la classe (par ex : print.glm )
  • une certaine préparation doit avoir été à ce nom général ( print ) pour que cela fonctionne, mais si vous simplement chercher à vous conformer aux noms de méthodes existants, vous n'avez pas besoin de (voir l'aide à laquelle j'ai fait référence plus tôt si vous en avez besoin).

Pour l'œil de l'observateur, et en particulier pour l'utilisateur de votre nouveau paquet d'ajustement de modèle funky, il est beaucoup plus pratique de pouvoir écrire predict(myfit, type="class") que predict.mykindoffit(myfit, type="class") .

Il y a bien d'autres choses à faire, mais cela devrait vous permettre de commencer. Cette façon de répartir les méthodes en fonction d'un attribut (classe) d'objets présente de nombreux inconvénients (et les puristes du langage C se réveillent probablement la nuit avec horreur), mais dans de nombreuses situations, elle fonctionne correctement. Avec la version actuelle de R, de nouvelles méthodes ont été implémentées (S4 et classes de référence), mais la plupart des gens utilisent encore (uniquement) S3.

59voto

Richie Cotton Points 35365

Pour commencer avec S3, regardez le code de la fonction median fonction. Tapez median à l'invite de commande révèle qu'il a une ligne dans son corps, à savoir

UseMethod("median")

Cela signifie qu'il s'agit d'une méthode S3. En d'autres termes, vous pouvez avoir un median pour différentes classes S3. Pour lister toutes les méthodes médianes possibles, tapez

methods(median) #actually not that interesting.  

Dans ce cas, il n'y a qu'une seule méthode, la méthode par défaut, qui est appelée pour tout. Vous pouvez voir le code de cette méthode en tapant

median.default

Un exemple beaucoup plus intéressant est le print qui dispose de nombreuses méthodes différentes.

methods(print)  #very exciting

Remarquez que certaines des méthodes ont * à côté de leur nom. Cela signifie qu'ils sont cachés dans l'espace de noms d'un paquet. Utilisez find pour savoir dans quel paquet ils se trouvent. Par exemple

find("acf")  #it's in the stats package
stats:::print.acf

0 votes

Donc, d'après votre réponse, cela signifie-t-il que median est une méthode S3 et print n'est pas un S3 (peut-être un S4) ?

0 votes

En regardant method(print) Je vois un print.zoo* mais en essayant de le trouver en utilisant find("zoo") cela donne character(0) et non le nom du paquet

40voto

Amit K Thakur Points 11

De http://adv-r.had.co.nz/OO-essentials.html :

Les trois systèmes OO de R diffèrent dans la façon dont les classes et les méthodes sont définies :

  • S3 met en œuvre un style de programmation OO appelé OO à fonctions génériques. C'est différent de la plupart des langages de programmation, comme Java, C++ et C#, qui implémentent le OO par passage de messages. Avec le passage de messages, les messages (méthodes) sont envoyés aux objets et l'objet détermine la fonction à appeler. à appeler. En général, cet objet a une apparence particulière dans l'appel de la méthode et apparaît généralement avant le nom de la méthode/message : p. ex. canvas.drawRect("blue"). S3 est différent. Alors que les calculs sont toujours sont toujours effectués par le biais de méthodes, un type spécial de fonction appelée générique décide de la méthode à appeler, par exemple, drawRect(canvas, "blue"). S3 est un système très informel. Il n'a pas de définition formelle des classes.

  • S4 fonctionne de manière similaire à S3, mais est plus formel. Il y a deux grandes différences avec S3. S4 a des définitions de classes formelles, qui décrivent la représentation et l'héritage de chaque classe. représentation et l'héritage de chaque classe, et possède des fonctions d'aide spéciales pour définir les génériques et les méthodes. S4 dispose également d'un système de multiple, ce qui signifie que les fonctions génériques peuvent choisir des méthodes basées sur la classe de n'importe quel nombre d'arguments, et pas seulement un.

  • Les classes de référence, appelées RC en abrégé, sont très différentes de S3 et S4. RC implémente le passage de messages OO, donc les méthodes appartiennent aux classes classes, et non aux fonctions. $ est utilisé pour séparer les objets et les méthodes, ainsi les appels de méthode ressemblent à canvas$drawRect("blue"). Les objets RC sont également mutables : ils n'utilisent pas la sémantique habituelle de R en matière de copie sur modification, mais sont modifiés sur place. mais sont modifiés sur place. Cela rend leur raisonnement plus difficile, mais leur permet de résoudre des problèmes qui sont plus difficiles à résoudre. de résoudre des problèmes qui sont difficiles à résoudre avec S3 ou S4.

Il y a aussi un autre système qui n'est pas tout à fait OO, mais il est important de le mentionner ici :

  • les types de base, les types internes de niveau C qui sous-tendent les autres systèmes OO. les autres systèmes OO. Les types de base sont principalement manipulés à l'aide du code C, mais il est important de les connaître car ils fournissent les bases de l'architecture. mais il est important de les connaître car ils fournissent les blocs de construction pour les autres systèmes OO.

13voto

Sam Hoice Points 1766

Je suis venu à cette question en me demandant surtout d'où venaient les noms. Il semble que cet article de wikipedia que le nom fait référence à la version du langage de programmation S sur lequel R est basé. Les schémas de répartition des méthodes décrits dans les autres réponses proviennent de S et sont étiquetés de manière appropriée en fonction de la version.

11voto

Harald Brendel Points 79

Essayez

methods(residuals)

qui liste, entre autres, "residuals.lm" et "residuals.glm". Cela signifie que lorsque vous avez ajusté un modèle linéaire, m, et que vous tapez residuals(m) le fichier residuals.lm sera appelé. Lorsque vous avez ajusté un modèle linéaire généralisé, residuals.glm sera appelé. C'est un peu le modèle objet C++ à l'envers. En C++, vous définissez une classe de base ayant des fonctions virtuelles, qui sont surchargées par les classes dérivées. En R, vous définissez une fonction virtuelle (c'est-à-dire générique), puis vous décidez quelles classes vont remplacer cette fonction (c'est-à-dire définir une méthode). Notez que les classes qui font cela n'ont pas besoin d'être dérivées d'une super classe commune. Je ne serais pas d'accord pour préférer généralement S3 à S4. S4 a plus de formalisme (= plus de typage) et cela peut être trop pour certaines applications. Les classes S4, cependant, peuvent être dé définies comme une classe ou une structure en C++. Vous pouvez spécifier qu'un objet d'une certaine classe est composé d'une chaîne de caractères et de deux chiffres par exemple :

setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))

Les méthodes qui sont appelées avec un objet de cette classe peuvent compter sur le fait que l'objet possède ces membres. C'est très différent des classes S3, qui ne sont qu'une liste d'éléments.

Avec S3 et S4, vous appelez une fonction membre par fun(object, args) et non par object$fun(args) . Si vous recherchez quelque chose comme ce dernier, jetez un coup d'œil au paquet proto.

0 votes

Je suis presque sûr que l'idée que les fonctions et méthodes membres appartiennent à des objets n'a pas beaucoup de sens en R. Les méthodes n'appartiennent pas à des objets (les fonctions sont aussi des objets) mais appartiennent à la fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X