Является ли класс S4 объектом? - PullRequest
1 голос
/ 03 апреля 2020

Из Расширяя R Палатой, я слышал, что все, что существует в R, является объектом (что также верно в Python: класс в Python является объектом, классом класса это метакласс.) Является ли класс S4 объектом? Какой тип класса S4?

> setClass("Person",
+ slots = c(
+ name = "character",
+ age = "numeric"
+ )
+ )

> typeof(Person)
Error in typeof(Person) : object 'Person' not found
> typeof("Person")
[1] "character"

> attributes(Person)
Error: object 'Person' not found

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Другой способ решения этой проблемы состоит в том, что объект, возвращаемый setClass(), является объектом класса classGeneratorFunction. Это определенно объект. Кроме того, поскольку функции в R также считаются объектами, это объект.

Мы проиллюстрируем это путем корректировки кода из исходного сообщения.

personGenerator <- setClass("Person",
                            slots = c(name = "character",
                                      age = "numeric"))

aPerson <- personGenerator()

На данный момент мы имеем функция генератора классов, которая генерирует объекты типа Person и экземпляр Person.

Это можно увидеть с помощью функции str().

str(aPerson)
> str(aPerson)
Formal class 'Person' [package ".GlobalEnv"] with 2 slots
  ..@ name: chr(0) 
  ..@ age : num(0) 

Аналогично, мы можем напечатать структуру функции personGenerator().

> str(personGenerator)
Formal class 'classGeneratorFunction' [package "methods"] with 3 slots
  ..@ .Data    :function (...)  
  ..@ className: chr "Person"
  .. ..- attr(*, "package")= chr ".GlobalEnv"
  ..@ package  : chr ".GlobalEnv"
> 

Возвращаясь к цитате Чамберса, она пересчитывается в Advanced R Хэдли Уикхема как:

Чтобы понять вычисления в R, полезны два лозунга .

- Все, что существует, является объектом

- Все, что происходит, является вызовом функции

Джон Чамберс цитирует в Advanced R , p , 79.

Поскольку исходный вопрос был немного двусмысленным, если «класс S4» относится к предмету, представленному возвращаемым значением setClass(), объекту типа classGeneratorFunction, это действительно объект. Однако, если «класс S4» в исходном вопросе относится к содержимому в аргументах setClass(), то, представляющее Person, не будет объектом, пока код не создаст его экземпляр, как показано выше с помощью функции personGenerator().

1 голос
/ 03 апреля 2020

Насколько я знаю, все в R является объектом, но сами классы не являются непосредственно объектами.

Мы можем делать объектно-ориентированное программирование в R. На самом деле, все в R является объект. Объект - это структура данных, имеющая некоторые атрибуты и методы, которые воздействуют на его атрибуты. Класс - это план объекта. Мы можем думать о классе как набросок (прототип) дома. Он содержит все подробности о полах, дверях, windows et c. На основании этих описаний мы строим дом.

здесь ).

S3

Представьте себе объекты S3. Вы никогда не назначаете их по-настоящему, вы просто определяете метод, который работает для этого указанного c класса:

summary.mnist <- function(x) print("HELLO!")
x <- 3
class(x) <- "mnist"
summary(x)
# [1] "HELLO!"
typeof(mnist)
# Error in typeof(mnist) : object 'mnist' not found

S4

Тем не менее, при работе с S4, для использования класса, который вы обычно определить функцию генератора через setClass. Эта функция генератора тогда является объектом типа замыкания, но сам класс не является объектом:

Person <- setClass("Person",
         slots = c(
         name = "character",
         age = "numeric"
         )
         )
typeof(Person)
# [1] "closure"
myPerson <- Person()
typeof(myPerson)
# [1] "S4"
...