Другой способ решения этой проблемы состоит в том, что объект, возвращаемый 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()
.