web-dev-qa-db-fra.com

classe en R: S3 vs S4

Je veux créer une classe en R, dois-je utiliser la classe S3 ou S4?

J'ai lu beaucoup de choses différentes à leur sujet, y en a-t-il un supérieur à l'autre?

52
RockScience

S3 ne peut distribuer que sur son premier argument, tandis que S4 peut distribuer sur plusieurs arguments. Si vous voulez pouvoir écrire des méthodes pour la fonction foo qui devraient faire différentes choses si on leur donne un objet de classe "bar" Ou des objets de classe donnés "bar" et "foobar", ou des objets donnés de la classe "barfoo" et "foobar", alors S4 fournit une bien meilleure façon de gérer une telle complexités.

S3 est très simple et facile à implémenter, mais n'est pas vraiment un système formel orienté objet. Cette simplicité se fait au détriment du fait que les objets appartenant à une classe ont les bons composants/emplacements, etc. Avec S3, je peux faire des choses comme class(obj) <- "lm" et la répartition des méthodes utilisera des méthodes pour le "lm" classe une fois passée obj, mais il n'y a aucune garantie que obj est vraiment un objet de classe "lm".

S3 est facile à implémenter, à documenter et nécessite moins de connaissances supplémentaires de la part du programmeur.

Lequel utiliser ne peut être que quelque chose que vous pouvez décider. Doug Bates (2003) a déclaré, par exemple, que pour de nouveaux projets, il utiliserait S4 sur S3. Je n'ai pas encore eu besoin d'utiliser autre chose que des méthodes S3.

Je voudrais donc m'asseoir et réfléchir aux types de classes et de méthodes que vous souhaitez appliquer à ces classes. Pensez à la fonctionnalité que vous souhaitez, et cela pointera probablement vers un système ou l'autre.

Douglas Bates. Conversion de packages en S4 . R News, 3 (1): 6-8, juin 2003

60
Gavin Simpson

Qu'en est-il de classes de référence ? ce n'est pas S3 et certains le considèrent comme du sucre syntaxique en plus de S4, mais c'est beaucoup de sucre.

Pour un court exemple, vérifiez cette réponse à une question que j'ai posée ici il y a quelques mois.

Je dois encore découvrir comment écrire des fichiers Rd pour ces classes.

7
mariotomo