r - 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
谢谢。
解决方案
看待这个问题的另一种方式是返回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()
推荐阅读
- cheat-engine - 内存查看器、作弊引擎中的 int 32 值来自哪里
- java - openjdk15的GCLogFileSize热点标志alrernative
- python - BeautifulSoup4:只获取 3 行数据而不是 12 行
- git - 如何更改 git 提交的日期
- php - Laravel DB::transaction 不接受变量
- java - 如何在 Android 上的 Xml 上设置视图布局重力?
- url - 在 URL 段/参数中存储 UI 状态与 cookie 或会话状态
- python - Calculate similarity between rows of a dataframe (count values in common)
- html - HTML 中 mailto 的错误
- sql - 以 MS Access 形式查看存储在 SQL Server 中的图像文件