Когда стоит использовать методы S4 в R-программировании? - PullRequest
68 голосов
/ 30 августа 2010

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

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

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

Ответы [ 7 ]

26 голосов
/ 30 августа 2010

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

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

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

25 голосов
/ 31 августа 2010

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

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

9 голосов
/ 30 августа 2010

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

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

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

Мне нравится suguar, что я могу сказать!

8 голосов
/ 17 января 2011

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

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

5 голосов
/ 31 августа 2010

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

5 голосов
/ 31 августа 2010

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

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

4 голосов
/ 03 августа 2012

Давным-давно 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. проверить содержимое объекта класса

...