Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R S4类是对象吗?_R_S4 - Fatal编程技术网

R S4类是对象吗?

R S4类是对象吗?,r,s4,R,S4,通过Chamber扩展R,我听说R中存在的所有东西都是对象(在Python中也是如此:Python中的类是对象,类的类是元类)。S4类是对象吗?S4课程的类型是什么 > setClass("Person", + slots = c( + name = "character", + age = "numeric" + ) + ) > typeof(Person) Error in typeof(Person) : object 'Person' not found > type

通过Chamber扩展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

谢谢。

据我所知,R中的所有东西都是对象,而类本身并不是直接的对象

我们可以在R中进行面向对象编程。事实上,R中的一切都是对象。 对象是一种数据结构,具有一些作用于其属性的属性和方法。 类是对象的蓝图。我们可以把课堂想象成房子的草图(原型)。它包含了关于地板、门、窗等的所有细节。基于这些描述,我们建造了房子

(来自)

S3 想想S3对象。您从未真正分配它们,您只需定义一个适用于此特定类的方法:

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

看待此问题的另一种方式是,
setClass()
返回的对象是类
classGeneratorFunction
的对象。它绝对是一个物体。而且,因为R中的函数也被视为对象,所以它是一个对象

我们将通过调整原始帖子中的代码来说明

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

aPerson <- personGenerator()
类似地,我们可以打印
personGenerator()
函数的结构

str(aPerson)
> str(aPerson)
Formal class 'Person' [package ".GlobalEnv"] with 2 slots
  ..@ name: chr(0) 
  ..@ age : num(0) 
> str(personGenerator)
Formal class 'classGeneratorFunction' [package "methods"] with 3 slots
  ..@ .Data    :function (...)  
  ..@ className: chr "Person"
  .. ..- attr(*, "package")= chr ".GlobalEnv"
  ..@ package  : chr ".GlobalEnv"
> 
回到钱伯斯的名言,哈德利·维克汉姆的《高级R》中有这样的描述:

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

--存在的一切都是对象

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

约翰·钱伯斯在《高级R,p。79


由于原始问题有点含糊不清,如果“S4类”指的是由
setClass()
的返回值表示的对象,即
classGeneratorFunction
类型的对象,那么这确实是一个对象。但是,如果原始问题中的“S4类”指的是
setClass()
的参数中的内容,则表示
人的对象在前面用
personGenerator()函数对其进行实例化之前不是对象

谢谢。将setClass()return赋值给变量的方式以及创建该类对象的方式不同于。我想知道哪种方法更可取?因为两者都有可能,这绝对是基于意见的:我认为“我的”方法是默认方法,因为这是
?setClass()
示例中的用法。那么,您对这个问题的答案是什么?我之所以说“不”,是因为类本身不是对象(就像python中的那样),而只有生成器函数才是对象。我认为这对于S3类来说更为清晰。或者你认为呢?按照我读问题的方式,
setClass()
返回一个类型为
classGeneratorFunction
的对象。
setClass()
返回的对象是一个对象。
setClass()
的输入是参数,在R中也是对象。也就是说,将这些参数组合到
Person
的实例中是另一个函数调用的结果,为了清楚起见,我将其命名为
personGenerator()
。直到一行代码使用<代码> PuthGuangoor()/<代码>来创建<代码>人>代码>的实例,<代码>人<代码>本身不存在,因此不是一个对象。你认为其中一个答案足够被接受吗?是的。提前感谢您的耐心等待。
str(aPerson)
> str(aPerson)
Formal class 'Person' [package ".GlobalEnv"] with 2 slots
  ..@ name: chr(0) 
  ..@ age : num(0) 
> str(personGenerator)
Formal class 'classGeneratorFunction' [package "methods"] with 3 slots
  ..@ .Data    :function (...)  
  ..@ className: chr "Person"
  .. ..- attr(*, "package")= chr ".GlobalEnv"
  ..@ package  : chr ".GlobalEnv"
>