Вот обновленное краткое изложение многочисленных объектных систем R в соответствии с "Advanced R, 2nd edition" (CRC Press, 2019) Хэдли Уикхэм (главный научный сотрудник RStudio), веб-представление которого здесь основано на главе об объектах -Ориентированное программирование .
Первое издание 2015 года представлено здесь в Интернете , а соответствующая глава по объектно-ориентированному программированию находится здесь .
Подходы к ОО-системам
Хэдли определяет следующее, чтобы различать два разных подхода к объектно-ориентированному программированию:
Функциональное ООП : методы (вызываемые фрагменты кода) относятся к универсальным функциям (не путать с универсальными методами Java / C # ). Думайте о методах, как о находящихся в глобальной таблице поиска. Метод для выполнения определяется системой времени выполнения на основе имени функции и типа (или класса объекта) одного или нескольких аргументов, переданных этой функции (это называется «отправкой метода»). Синтаксис-накрест, вызовы методов могут выглядеть как обычные вызовы функций: myfunc(object, arg1, arg2)
. Этот вызов заставит среду выполнения искать метод, связанный с парой («myfunc», typeof (объект)) или, возможно, («myfunc», typeof (объект), typeof (arg1), typeof (arg2))если язык это поддерживает. В R S3 полное имя универсальной функции дает пару (имя-функция, класс) . Например: mean.Date
это метод вычисления среднего числа дат. Попробуйте methods("mean")
перечислить общие методы с именем функции mean
. Функциональный подход ООП можно найти, например, в Smalltalk , пионере ООП , в объектной системе Common Lisp и в Julia . Хэдли отмечает, что «По сравнению с R, реализация Джулии полностью разработана и чрезвычайно эффективна».
Инкапсулированное ООП : методы принадлежат объектам или классам, и вызовы методов обычно выглядят так object.method(arg1, arg2)
. Это называется инкапсулированным, потому что объект инкапсулирует как данные (поля), так и поведение (методы). Подумайте о методе, который находится в таблице поиска, прикрепленной к объекту или описанию класса объекта. Среда выполнения ищет метод на основе имени метода и, возможно, типа одного или нескольких аргументов. Это подход, применяемый в «популярных» объектно-ориентированных языках, таких как C ++, Java, C #.
В обоих случаях, если поддерживается наследование (возможно, так и есть), среда выполнения может перемещаться по иерархии классов вверх, пока не найдет совпадение для ключа поиска вызова.
Как узнать, к какой системе принадлежит объект R
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
Объектные системы R
S3
- Функциональный подход ООП.
- Самая важная система по Хэдли.
- Самый простой, самый распространенный. Первая объектно-ориентированная система, использованная Р.
- Поставляется с базой R, используется во всей базе R.
- Скорее полагается на условности, чем на принудительные гарантии.
- См. Чемберс, Джона М. и Тревора Дж. Хасти. 1992. "Статистические модели в С." Уодсворт и Брукс / Продвинутые книги и программное обеспечение Коула.
- Подробности в «Advanced R, 2-е издание» здесь .
S4
- Функциональный подход ООП.
- Третья по важности система по Хэдли.
- Перепишите S3, следовательно, аналогично S3, но более формально и строго: это заставляет вас тщательно продумать дизайн программы. Подходит для создания больших систем (например, для проекта Bioconductor ).
- Реализовано в базовом пакете "методы".
- См .: Chambers, John M. 1998. «Programming with Data: A Guide to S Language». Springer.
- Подробности в «Advanced R, 2-е издание» здесь .
RC aka "Референсные классы"
- Инкапсулированный подход ООП.
- Поставляется с базой R.
- На основе S4.
- RC-объекты - это особый тип объектов S4, которые также «изменяемы». т.е. вместо того, чтобы использовать обычную семантику R «копирование при изменении», они могут быть изменены на месте. Обратите внимание, что об изменяемом состоянии сложно рассуждать, и он является источником уродливых ошибок, но может привести к более эффективному коду в определенных приложениях.
R6
- Инкапсулированный подход ООП.
- Вторая по важности система по Хэдли.
- Можно найти в пакете R6 (установить с помощью
library(R6)
)
- Подобен RC, но легче и намного быстрее: не зависит от S4 или пакета методов . Создан на основе среды R. Также имеет:
- публичные и частные методы
- активные привязки (поля, которые при доступе фактически вызывают метод)
- наследование классов, которое работает между пакетами
- оба метод класса (код , который принадлежит к классу и может получить доступ к экземпляру с помощью
self
, private
, super
) и функциями членов (функции , назначенные на поля, но которые не являются методами, только функция)
- Предоставляет стандартизированный способ избежать семантики R "копирование при изменении"
- См. Сайт пакета: «R6: Инкапсулированное объектно-ориентированное программирование для R» .
- Подробности в «Advanced R, 2-е издание» здесь .
другие
Есть и другие, такие как R.oo (похожий на RC), proto (на основе прототипов, думаю, JavaScript) и Mutatr . Однако "Advanced R" говорит:
Помимо широко применяемого R6, эти системы представляют прежде всего теоретический интерес. У них есть свои сильные стороны, но немногие пользователи R знают и понимают их, поэтому другим трудно читать и вносить свой вклад в ваш код.
Не забудьте также прочитать главу о компромиссах в «Advanced R, 2nd edition» .