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