Когда стоит использовать методы 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, но я бы подождал, пока она созреет, прежде чем использовать ее в своем собственном коде.
Отличный вопрос! и я надеюсь, что это вызовет некоторое вдумчивое обсуждение...
Я никогда не использовал его и не собираюсь использовать по следующим причинам:
- Спектакль
- У меня нет терпения, чтобы полностью понять S4 и его отношение к S3.
- Синтаксический 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().