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

StackOverflow https://stackoverflow.com/questions/3602154

  •  25-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

Однажды ROXYGEN2 не понравился методы S4. По состоянию на 2017 год (как минимум) они работают вместе.

У меня было несчастье создания некоторых функций, которые необходимы методы работы с классами S3 и S4. Было невероятно больно сохранить этот код, работающий в течение многих лет, когда R-CORE имеет несколько раз, изменив подробную информацию о том, как эти системы взаимодействуют и как работают пространства имен и как работает проверка RCMD.

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

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

Terry Terneau писал: на 90 процентов того, что я делаю, я настоятельно предпочитаю свободный (S3), а не жесткие (S4) классы ... Мои сводки S4 VS S3

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top