Попробуйте
methods(residuals)
, в котором перечислены, среди прочего, "residuals.lm" и "residuals.glm". Это означает, что если вы укажете линейную модель m и тип residuals(m)
, будет вызван residuals.lm. Когда вы укажете обобщенную линейную модель, будет вызван residuals.glm.
Это своего рода объектная модель C ++, перевернутая с ног на голову. В C ++ вы определяете базовый класс, имеющий виртуальные функции, которые переопределяются производным классом.
В R вы определяете виртуальную (также называемую универсальной) функцию, а затем решаете, какие классы будут переопределять эту функцию (или определять метод). Обратите внимание, что классы, делающие это, не должны быть производными от одного общего суперкласса.
Я бы не согласился вообще предпочесть S3, а не S4. S4 имеет больше формализма (= больше печатания), и это может быть слишком много для некоторых приложений. Классы S4, однако, могут быть определены как класс или структура в C ++. Вы можете указать, что объект определенного класса состоит из строки и двух чисел, например:
setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))
Методы, вызываемые с объектом этого класса, могут полагаться на объект, имеющий эти члены. Это сильно отличается от классов S3, которые представляют собой просто список элементов.
С S3 и S4 вы вызываете функцию-член fun(object, args)
, а не object$fun(args)
. Если вы ищете что-то вроде последнего, посмотрите на пакет proto.