Поскольку я новичок в R, я не знаю, что такое методы и объекты S3. Я обнаружил, что существуют объектные системы S3 и S4, и некоторые рекомендуют по возможности использовать S3 вместо S4 (см. Руководство по стилю R от Google по адресу http://google-styleguide.googlecode.com/svn/trunk/google-r-style. html ) *. Однако я не знаю точного определения методов / объектов S3.
Обновление: по состоянию на 2019 год гиперссылка на Google R Style Guide находится здесь .
Вот обновленное краткое изложение многочисленных объектных систем 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
Объектные системы R
S3
S4
RC aka "Референсные классы"
R6
library(R6)
)self
,private
,super
) и функциями членов (функции , назначенные на поля, но которые не являются методами, только функция)другие
Есть и другие, такие как R.oo (похожий на RC), proto (на основе прототипов, думаю, JavaScript) и Mutatr . Однако "Advanced R" говорит:
Не забудьте также прочитать главу о компромиссах в «Advanced R, 2nd edition» .
источник