класс в R: S3 против S4 - PullRequest
52 голосов
/ 23 июня 2011

Я хочу создать класс в R, должен ли я использовать класс S3 или S4?

Я читал о них много разных, один из них превосходит другой?

Ответы [ 2 ]

60 голосов
/ 23 июня 2011

S3 может отправлять только первый аргумент, тогда как S4 может отправлять несколько аргументов.Если вы хотите иметь возможность писать методы для функции foo, которые должны делать разные вещи, если дан объект класса "bar" или объекты класса "bar" и "foobar", или данные объектыкласса "barfoo" и "foobar", тогда S4 обеспечивает гораздо лучший способ справиться с такими сложностями.

S3 очень прост и легко реализуем, но на самом деле не является формальной объектно-ориентированной системой.Эта простота достигается за счет обеспечения того, чтобы объекты, принадлежащие к классу, имели правильные компоненты / слоты и т. Д. С помощью S3 я могу делать такие вещи, как class(obj) <- "lm", а диспетчеризация методов будет использовать методы для класса "lm" при передаче obj,но нет никакой гарантии, что obj действительно является объектом класса "lm".

S3 прост в реализации, документировании и требует меньше дополнительных знаний со стороны программиста.

Что использовать, может быть только то, что вы можете решить.Например, Даг Бейтс (2003) сказал, что для новых проектов он будет использовать S4 вместо S3.У меня еще не было необходимости использовать ничего, кроме методов S3.

Поэтому я бы сел и подумал о видах классов и методах, которые вы хотите использовать в этих классах.Подумайте о функциональности, которую вы хотите, и это, вероятно, будет указывать на одну или другую систему.

Дуглас Бейтс. Преобразование пакетов в S4 .R News, 3 (1): 6-8, июнь 2003

7 голосов
/ 20 июля 2011

А как насчет эталонных классов ?это не S3, и некоторые считают его синтаксическим сахаром поверх S4, но это много сахара.

Для краткого примера, проверьте это отвечает на вопросЯ спросил здесь несколько месяцев назад.

Мне все еще нужно выяснить, как писать Rd-файлы для таких классов.

...