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

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

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

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

EDIT: Для ясности я действительно ценю ответы, и обсуждение OO в целом в R. OOP можно сделать многими способами в R, но мой вопрос действительно направлен на добавленную стоимость использования S4-методов специально.

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

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

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