Что означает "методы 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.


чтобы начать работу с 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.