Р – класс S4
Система для объектно-ориентированного программирования — это система S4 в R. Как ни странно, R поддерживает как минимум три отдельные системы объектно-ориентированного программирования S3, S4 и S5. Они следуют стандартному процессу производства объектов и имеют четко определенную структуру. Это повышает безопасность нашего кода и предотвращает непреднамеренное совершение простых ошибок.
Определение класса S4 на языке программирования R
В R переменные-члены называются слотами. Имя и слоты (вместе с классом слота), которые будет иметь класс, должны быть определены. Например,
setClass("Employee", slots=list(name="character", age="numeric", role="character"))
Имя, возраст и роль — это три слота (переменные-члены) в созданном нами классе Employee.
Создание объекта S4 в R
Объекты S4 создаются с помощью функции new().
employee1 <- new("Employee", name = "Sanket", age = 21, role = "Software Developer")
Указав имя класса Student и значения для каждого из трех слотов в new, мы сгенерировали объект student1 в new().
Пример: класс S4 и объект в R
R
# create a class "Employee" with three member variables setClass ( "Employee" , slots= list (name= "character" , age= "numeric" , role= "character" )) # create an object of class emp1 <- new ( "Employee" , name = "Sanket" , age = 21, role = "Software Developer" ) # call emp1 object emp1 |
Выход:
An object of class "Employee" Slot "name": [1] "Sanket" Slot "age": [1] 21 Slot "role": [1] "Software Developer"
Здесь мы использовали метод setClass() для создания класса S4 под названием Employee. Затем метод new() использовался для создания объекта с именем emp1.
new("Employee", name = "Sanket", age = 21, role = "Software Developer")
Здесь,
- имя принимает значение «персонаж», поэтому мы передали «Санкет»
- age принимает «числовое» значение, поэтому мы передали числовое значение 21
- роль принимает значение «персонаж», поэтому мы передали «Разработчик программного обеспечения».
Доступ к слоту класса S4 в R
В R мы используем оператор @ для доступа к слотам. Например,
# access name slot of Employee class emp1@name
Пример: Доступ к слоту класса S4
R
# access name slot of Employee class emp1@name # access role slot of Employee emp1@role |
Выход:
[1] "Sanket" [1] "Software Developer"
Здесь,
- Emp1 получает доступ к ячейке имени сотрудника и выводит «Sanket».
- Emp1 получает доступ к слоту роли информации о сотруднике и выводит «Разработчик программного обеспечения».
Изменить слот класса S4 в R
В R мы можем получить доступ к слоту и изменить его значение, используя символ @. Например,
# access and assign new value to role slot emp1@role <- "Web Designer" # print new slot value emp1@role
Здесь значение слота роли изменено с «Разработчик программного обеспечения» на «Веб-дизайнер».
Пример: Изменить слот класса S4
R
emp1@name emp1@role # access and assign new value to role slot emp1@role <- "Web Designer" emp1@role |
Выход:
[1] "Sanket" [1] "Software Developer" [1] "Web Designer"
Общая функция и метод S4 в R
Подобно классу S3, класс S4 также имеет методы, которые являются частью универсальных функций, а не самого класса. Работа с дженериками S4 вполне сопоставима с работой с дженериками S3. Чтобы узнать больше о дженериках, посетите сайт дженериков S3.
Когда мы просто вводим имя объекта в интерактивном режиме после создания объекта класса, объект печатается. Для этого используется общий функциональный дисплей S4. Эта функция отображается в списке выше. Эта функция является эквивалентом функции S3 print() в S4.
# call object without show() emp1 # call object with show() show(emp1)
Выход:
An object of class "Employee" Slot "name": [1] "Sanket" Slot "age": [1] 21 Slot "role": [1] "Software Developer"
Здесь в обоих случаях вывод будет таким же, как показано выше.
Пример: проверьте, является ли функция общей функцией
isS4(print) # Output: [1] FALSE isS4(show) # Output: [1] TRUE
Здесь функция isS4() использовалась для определения того, является ли функция универсальной функцией S4. Поскольку функция возвращает FALSE для печати и TRUE для показа, если последний является универсальной функцией S4.
Написание собственного метода в R
С помощью функции setMethod() в R мы можем создавать собственные методы. Например, мы можем использовать следующий код для создания нашей функции класса для обобщенного метода display().
R
# create own method setMethod ( "show" , "Employee" , function (object) { cat (object@name, "
" ) cat (object@age, "years old
" ) cat ( "Role:" , object@role, "
" ) } ) # call employee1 object emp1 |
Выход:
Sanket 21 years old Role: Software Developer