Что означает "методы S3" в R?
поскольку я довольно новичок в R, я не знаю, что такое методы и объекты S3. Я обнаружил, что существуют объектные системы S3 и S4, и некоторые рекомендуют использовать S3 над S4, если это возможно (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html). Однако я не знаю точного определения методов/объектов S3.
5 ответов
большую часть нужной информации можно найти, посмотрев на ?S3
или ?UseMethod
, но в двух словах:
S3 относится к схеме диспетчеризации методов. Если вы некоторое время использовали R, вы заметите, что есть print
, predict
и summary
методы для многих различных видов объектов.
в S3 это работает по:
- настройки класса объектов
проценты (например: возвращаемая стоимость
вызов метода
glm
присвоен классglm
) - предоставление метода с общим
имя (например,
print
), затем точка и затем имя класса (например,:print.glm
) - некоторая подготовка должна была быть
сделано для этого общего имени (
print
) чтобы это сработало, но если ты ... просто смотрю, чтобы соответствовать себе существующие имена методов, вам не нужно это (см. справку, на которую я ссылался раньше, если вы это сделаете).
к глазу зрителя, и в частности, пользователя вашего вновь созданного фанки модельный подходящий пакет, гораздо удобнее иметь возможность вводить predict(myfit, type="class")
чем predict.mykindoffit(myfit, type="class")
.
есть еще немного, но это должно заставить вас начать. Существует довольно много недостатков в этом способе диспетчеризации методов, основанных на атрибуте (классе) объектов (и пуристы C, вероятно, не спят по ночам в ужасе от этого), но для многих ситуаций он работает прилично. С текущей версией R были реализованы новые способы (S4 и ссылочные классы), но большинство людей все еще (только) используют S3.
от http://adv-r.had.co.nz/OO-essentials.html:
три системы OO R отличаются тем, как определяются классы и методы:
S3 реализует стиль программирования OO, называемый generic-function OO. Это отличается от большинства языков программирования, таких как Java, C++ и C#, которые реализуют передачу сообщений OO. С передачи сообщений, сообщения (методы) отправляются объектам, и объект определяет, какая функция к вызов. Как правило, этот объект имеет специальный внешний вид в методе вызов, обычно появляющийся перед именем метода / сообщения: например холст.drawRect("синий"). С3-другому. Пока вычисления все еще выполняется с помощью методов, специального типа функции, называемой generic функция решает, какой метод вызвать, например, drawRect (canvas, "blue"). S3 - очень случайная система. У него нет формального определения классов.
S4 работает аналогично S3, но больше формальный. Есть два основных различия в С3. S4 имеет формальные определения классов, которые описывают представление и наследование для каждого класса, и имеет специальный помощник функции для определения дженериков и методов. S4 также имеет несколько dispatch, что означает, что общие функции могут выбирать методы на основе класс любого числа аргументов, а не только одного.
ссылочные классы, называемые RC для краткости, сильно отличаются от S3 и S4. Радиоуправляемый реализует передача сообщений OO, поэтому методы принадлежат классы, а не функции. $ используется для разделения объектов и методов, так вызовы методов выглядят как canvas$drawRect ("синий"). Объекты RC также mutable: они не используют обычную семантику копирования-изменения R, но являются изменено на месте. Это делает их более трудным рассуждать о, но позволяет их для решения проблем, которые трудно решить с помощью S3 или S4.
есть еще одна система, которая не совсем OO, но это важный упомянуть здесь:
- базовые типы, внутренние типы C-уровня, которые лежат в основе другого OO системный. Базовые типы в основном обрабатываются с помощью кода C, но они важно знать о потому что они обеспечивают строительные блоки для другие системы ОО.
Я пришел к этому вопросу в основном интересно, откуда пришли имена. Он появляется из эта статья в Википедии это имя относится к версии языка программирования S, на котором основан R. Схемы диспетчеризации метода, описанные в других ответах, исходят из S и маркируются соответствующим образом в соответствии с версией.
попробовать
methods(residuals)
в котором перечислены, среди прочего, " остатки.лм" и "остатки.glm". Это означает, когда вы установили линейную модель, m и тип residuals(m)
, остатки.будет вызван lm. Если вы установили обобщенную линейную модель, остатки.glm будет вызван.
Это своего рода объектная модель C++, перевернутая вверх дном. В C++ определяется базовый класс, имеющий виртуальные функции, которые переопределяются производным классом classed.
В R вы определяете виртуальную (aka generic) функцию, а затем решите, какие классы будут переопределять эту функцию (aka define a method). Обратите внимание, что классы, выполняющие это, не должны быть производными от одного общего суперкласса.
Я бы не согласился вообще предпочесть S3 над S4. S4 имеет больше формализма (= больше ввода), и это может быть слишком много для некоторых приложений. Однако классы S4 могут быть определены как класс или структура в C++. Можно указать, что объект определенного класса состоит из строки и двух чисел для пример:
setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))
методы, вызываемые с объектом этого класса, могут полагаться на объект, имеющий эти члены. Это очень отличается от классов S3, которые являются всего лишь списком группы элементов.
С S3 и S4, вы вызываете функцию-член по fun(object, args)
а не object$fun(args)
. Если вы ищете что-то подобное последнему, взгляните на пакет proto.