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

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

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

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

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

68
задан Andrie 25 August 2011 в 13:15
поделиться

3 ответа

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

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

25
ответ дан 24 November 2019 в 14:21
поделиться

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

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

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

26
ответ дан 24 November 2019 в 14:21
поделиться

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

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

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

Я люблю сахар, что тут скажешь!

9
ответ дан 24 November 2019 в 14:21
поделиться