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


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

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

когда вы рассматриваете возможность написания реализаций S4 для R?

EDIT : для ясности я ценю ответы и обсуждение ОО в целом в R. ООП может быть сделано различными способами в R, но мой вопрос действительно направлен на добавленную стоимость использования методов S4 конкретно.

7 66

7 ответов:

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

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

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

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

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

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

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

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

Мне нравится сугуар, что тут скажешь!

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

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

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

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

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

когда-то Roxygen2 не любил методы S4. С 2017 года (по крайней мере) они работают вместе.

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

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

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

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

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

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