Р – класс S4

Опубликовано: 21 Февраля, 2023

Система для объектно-ориентированного программирования — это система 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