Что означает "методы S3" в R?



поскольку я довольно новичок в R, я не знаю, что такое методы и объекты S3. Я обнаружил, что существуют объектные системы S3 и S4, и некоторые рекомендуют использовать S3 над S4, если это возможно (http://google-styleguide.googlecode.com/svn/trunk/google-r-style.html). однако я не знаю точного определения методов/объектов S3.

685   5  

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("синий"). S3-это другое. В то время как вычисления по-прежнему осуществляется с помощью методов, специальный тип функции называется общим функция решает, какой метод вызвать, например, drawRect (canvas, "blue"). S3 - это очень случайная система. Он не имеет формального определения классов.

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

  • ссылочные классы, называемые RC для краткости, сильно отличаются от S3 и S4. Радиоуправляемый реализует передача сообщений OO, поэтому методы принадлежат классы, а не функции. $ используется для разделения объектов и методов, так вызовы метода выглядят как canvas$drawRect ("синий"). RC объекты также являются mutable: они не используют обычную семантику копирования на изменение R, но являются изменено на месте. Это делает их труднее рассуждать, но позволяет они решают проблемы, которые трудно решить с помощью S3 или S4.

есть еще одна система, которая не совсем OO, но это важный чтобы упомянуть здесь:

  • базовые типы, внутренние типы C-уровня, которые лежат в основе других OO системный. Базовые типы в основном управляются с помощью кода C, но они важно знать о том, потому что они обеспечивают строительные блоки для другие системы ОО.

Я пришел к этому вопросу в основном интересно, откуда пришли имена. Он появляется из эта статья в Википедии это имя относится к версии языка программирования S, на котором основан R. Схемы диспетчеризации метода, описанные в других ответах, поступают из S и маркируются соответствующим образом в соответствии с версией.

попробовать

methods(residuals)

который перечисляет, среди прочего, " остатки.лм" и "остатки.ГЛМ". Это означает, когда вы установили линейную модель, m и тип residuals(m), остатки.lm будет называться. Если вы установили обобщенную линейную модель, остатки.glm будет называться. Это своего рода объектная модель C++, перевернутая с ног на голову. В C++ вы определяете базовый класс, имеющий виртуальные функции, которые переопределяются производным классом. В R вы определяете виртуальную (aka generic) функцию, а затем вы решите, какие классы будут переопределять эту функцию (aka define a method). Обратите внимание, что классы, выполняющие это, не должны быть получены из одного общего суперкласса. Я бы не согласился, как правило, предпочитают С3 по С4. S4 имеет более формализма (= печатать) и это может быть слишком много для некоторых приложений. Однако классы S4 могут быть определены как класс или структура в C++. Вы можете указать, что объект определенного класса состоит из строк и двух чисел пример:

setClass("myClass", representation(label = "character", x = "numeric", y = "numeric"))

методы, которые вызываются с объектом этого класса, могут полагаться на объект, имеющий эти члены. Это очень отличается от классов S3, которые являются просто списком группы элементов.

С S3 и S4, вы вызываете функцию-член по fun(object, args) а не object$fun(args). Если вы ищете что-то вроде последнего, взгляните на пакет прото.

Comments

    Ничего не найдено.