Подтвердить что ты не робот

Создание классов в R: S3, S4, R5 (RC) или R6?

Я как бы открываю открытый вопрос для поиска преимуществ или недостатков для создания новых классов в R. Из того, что я могу сказать, существует по существу четыре различные парадигмы, которые используются при создании классов в R, S3, S4, R5 (или RC) и R6.

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

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

R5 кажется немного более похожим на то, к чему я привык, где определения методов привязаны к классам, а не диспетчеризация функций. Здесь есть еще немного мысли, которые вступают в игру с организацией объекта в терминах класса, к которому я бы привык. Одним из возможных недостатков является то, что R5 также построен из S4.

R6, по-видимому, является переписанием R5 человеком, который добавляет в микс больше функций ООП, таких как частные и публичные функции и свойства, но я вряд ли найду поддержку для этих классов в противном случае, поскольку информация о них кажется быть редкими с помощью поиска Google.

Как вы можете сказать, я борюсь с концепциями OO в R, и я не могу понять, какие грани, которые обычно связаны с OOP:

  • Тип Безопасность/Типы
  • Метод/привязка объекта, инкапсуляция, переменные-члены и т.д.
  • Распространение имен и организация кода
  • Версии наследования.

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

4b9b3361

Ответ 1

Кажется, вы уже знаете некоторые определения и применения для разных типов ООП. Я дам свое мнение о том, когда это целесообразно использовать.

  • Используйте классы S3 для ситуаций, в которых применяются оба следующих условия: (a) ваш объект статичен, а не самомодифицируется, и (b) вам не нужны сигнатуры методов с несколькими аргументами, т.е. ваш метод отправляет чисто по первому аргументу, классу S3 объекта. Кроме того, классы S3 являются хорошим решением, когда вы можете жить с этими ограничениями и хотите перегрузить многие операторы.

  • Используйте классы S4, если ваш объект статичен, а не самомодифицирован, но вы заботитесь о сигнатурах с несколькими аргументами. По моему опыту, S4 OOP всегда был более сложным, чем того стоит, хотя он "гарантирует" тип безопасности в некоторой степени.

  • Используйте ссылочные классы, если ваш объект самомодифицируется. В противном случае вам придется определить многие методы замены (например, some_method<-, который вызывается с синтаксисом some_method(obj) <- value). Это неудобно и вычислительно медленно, так как R будет создавать полную копию объекта каждый раз. R6 - хорошая замена, хотя я не счел это необходимым для моих целей.

Большинство людей, новых для R, думают, что это смущает; что причиной столь многих реализаций ООП является отсутствие консенсуса.

Это неверно.

Из-за его статистического характера большинство гетерогенных структур в R (то есть вещей, которые должны быть объективными) в конечном итоге являются результатом статистического алгоритма: объект lm, glmnet, gbm и т.д. Обычно достаточно объединить эту информацию и предоставить ожидаемые интерфейсы для ее суммирования: print, summary и т.д.

Благодаря своему наследию как статистической игровой площадке это освобождает пользователя от необходимости думать о более продвинутых концепциях, таких как наследование и распределение/де-распределение, и открывает игровое поле для большего количества участников. Это означает, что в R немного сложнее создавать сложные сложные проекты (например, веб-серверы, текстовые синтаксические анализаторы, графические интерфейсы и т.д.), Чем в типичном объектно-ориентированном языке, таком как Ruby, но отсутствие единого OOP-типа сбалансированный простотой использования.

Последний способ подумать о том, что разные подходы похожи на фазовые переходы в веществе: твердом, газообразном, жидком. Вместо того, чтобы относиться ко всем гетерогенным структурам (т.е. К ООП-подобным вещам) равномерно, некоторые из них более естественны под одной структурой, чем другие. Если я обертываю простой список в классе S3, чтобы хорошо отображать перегруженный метод print, было бы довольно глупо настраивать для этой цели целый ссылочный класс.