Когда стоит использовать методы S4 в R-программировании?

Я регулярно программирую на R в профессиональном контексте и пишу пакеты для клиентов или сотрудников. Некоторые из программистов здесь имеют опыт работы с Java и настаивают на том, чтобы делать все объектно-ориентированным способом, используя методы S4. С другой стороны, мой опыт показывает, что реализации S4 часто работают хуже и вызывают гораздо большую головную боль при попытке заставить код делать то, что вы от него хотите.

Я определенно согласен с тем, что в некоторых случаях вы должны иметь возможность создавать сложные объекты или добавлять существующие объекты контролируемым образом. Но в большинстве случаев реализации S4 можно легко сделать с помощью классических списков, без всяких хлопот, таких как определение standardGeneric, методов, конструкторов, инициализаторов и тому подобного.

Когда вы планируете писать S4-реализации для R?

РЕДАКТИРОВАТЬ: Для ясности, я ценю ответы и обсуждение ОО в целом в R. ООП может быть проведено множеством способов в R, но мой вопрос действительно нацелен на дополнительную ценность использования методов S4 конкретно.

7 ответов

Решение

Я предполагаю, что это не относится к вам напрямую, но если вы разрабатываете пакеты для Bioconductor, есть стимул использовать S4, так как они активно поощряют его использование и уже большую часть десятилетия - так что все основные пакеты интенсивно используют S4.

Я считаю, что все дополнительные издержки - это боль - setGeneric, setMethod, работа с NAMESPACE и т. Д. При этом я нахожу, что структура, которую он навязывает, потенциал для расширяемости и другие подобные вещи могут стоить этого. Как и во всем, есть компромиссы. Я думаю, что это может быть намного чище - мне не нравится, как методы S3 просто маскируются соглашением об именах (foo.class). Несмотря на это, я склонен избегать интенсивного использования S4 в своем собственном коде, если мне не говорят делать это.

Мой опыт соответствует вашему, поэтому я использую исключительно S3.

Для пояснения: у S4 есть некоторые удобные функции (например, диспетчеризация по нескольким аргументам и проверка типа слотов), но я не сталкивался с ситуацией, когда функции перевешивали затраты. Примеры затрат включают: любое изменение слота требует полной копии объекта и (что может быть хуже) текущих изменений в методах S4.

Короче говоря, мне нравится идея S4, но я бы подождал, пока она созреет, прежде чем использовать ее в своем собственном коде.

Отличный вопрос! и я надеюсь, что это вызовет некоторое вдумчивое обсуждение...

Я никогда не использовал его и не собираюсь использовать по следующим причинам:

  1. Спектакль
  2. У меня нет терпения, чтобы полностью понять S4 и его отношение к S3.
  3. Синтаксический suguar: я бы предпочел использовать object.method(), а не метод (object).

Я люблю suguar, что я могу сказать!

Я изучил S4, чтобы расширить Пространственные (sp) классы для данных о следах животных. Это был лучший выбор (наиболее последовательный, общий и близко соответствующий многим определениям ГИС) из доступных вариантов, чтобы избежать написания всего, что требуется с нуля. Я не считаю S4 таким обременительным, как говорят многие, но теперь я привык исследовать основную структуру таких объектов. Производительность тоже хорошая, я думаю, что это можно сделать хорошо, хотя при плохой работе есть ловушки производительности.

Если пространственные данные представляют интерес для вас, spatstat является хорошим примером того, как сделать много подобных вещей в sp в S3, хотя (как и в случае с кажущимся всем пространственным. . .) вряд ли когда-либо будут чистые аналогии между структурами данных в разных программах,

Классы S4 играют важную роль в пространственной статистике (пакет sensu sp), где преобразование данных одного типа в другой кажется беспроблемным. Подводным камнем является отладка, которая, по моему опыту, в лучшем случае утомительна. До сих пор я справился с S3, но, возможно, рассмотрю возможность использования S4 в будущем.

Со временем, когда вещи много разыгрываются, я полагаю, что они будут играть важную роль, по крайней мере, в основных особенностях различных областей R (может быть, это пространственный анализ, эконометрика, окружающая среда...)

Давным-давно Roxygen2 не нравились методы S4. По состоянию на 2017 год (как минимум) они работают вместе.

У меня была неудача создания некоторых функций, которые нуждались в методах для работы с классами S3 и S4. Поддерживать работу этого кода на протяжении многих лет было невероятно больно, поскольку R-core многократно меняла детали взаимодействия этих систем и работы пространств имен и проверки Rcmd.

Если вам не нравится руководство по стилю Google, примите во внимание комментарии этих известных разработчиков R-пакетов из этой ветки на R-help

Фрэнк Харрелл: "Если вы любите компьютерные науки больше, чем цените свое время, используйте S4".

Терри Терно писал: "Для 90 процентов того, что я делаю, я настоятельно предпочитаю свободные (S3), а не жесткие (S4) классы…. Мое резюме S4 против S3

S4 имеет большой прирост: 1. неудобство при записи 2. сложность в отладке 3. способность писать очень непонятный код 4. дизайн

S4 Прибыль: 5. способность направлять автоматические преобразования 6. проверять содержимое объекта класса

Не забывайте, что есть также R.oo (на CRAN), который предоставляет третий способ выполнения OO в R. На мой взгляд, это обеспечивает систему OO, которая может быть более знакома программистам, мигрирующим из других систем - в частности, вместо того, чтобы иметь общий функции (чтобы print (foo) затем отправляла класс foo), методы привязаны к объекту, так что вы бы сделали foo $ print () - так же, как в python или C++, вы сделали бы foo.print().

Другие вопросы по тегам