首页 > 解决方案 > S4 类是对象吗?

问题描述

从Chamber 的Extending 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

谢谢。

标签: rs4

解决方案


看待这个问题的另一种方式是返回setClass()的对象是 class 的对象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"
> 

回到钱伯斯的引述,它在 Hadley Wickham 的Advanced R中被描述为:

要理解 R 中的计算,有两个口号很有帮助。

-- 存在的一切都是对象

-- 发生的一切都是函数调用

John Chambers 在Advanced R , p. 中引用。79.

由于原来的问题有点模棱两可,如果“S4类”指的是 的返回值所代表的东西setClass(),一个类型的对象classGeneratorFunction,这确实是一个对象。但是,如果原始问题中的“S4 类”指的是 的参数中的内容,则setClass()表示的事物不是对象,直到代码用函数Person如上所示实例化它。personGenerator()


推荐阅读