gpt4 book ai didi

r - 为什么类被认为是 R 中向量的特例?

转载 作者:行者123 更新时间:2023-12-01 01:48:19 25 4
gpt4 key购买 nike

我正在阅读 Hands-on Programming with R .作者写了下面一段——

A class is a special case of an atomic vector. For example, the die matrix is a special case of a double vector. Every element in the matrix is still a double, but the elements have been arranged into a new structure. R added a class attribute to die when you changed its dimensions. This class describes die’s new format. Many R functions will specifically look for an object’s class attribute, and then handle the object in a predetermined way based on the attribute.



据我所知,这个陈述不应该是相反的 - 向量是矩阵的特例,因为它的维度是 Nx1而不是 NxM .相似,向量不应该是类的特例,因为向量有 NULL类(class)。

为什么不是这样?

最佳答案

作者所指的(以一种不好的方式恕我直言)是对象的内部表示。它们都是某种类型的“列表”,其中包含定义 R 如何处理它的额外信息。

以矩阵为例。矩阵是具有称为“dim”的额外属性的向量。正是这个属性使它成为一个矩阵。去掉属性,显示底层向量结构:

> x <- matrix(1:10, ncol = 5)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10

> attributes(x)
$dim
[1] 2 5

> attr(x,"dim") <- NULL
> x
[1] 1 2 3 4 5 6 7 8 9 10

另一方面,数据框是列表的特例。它们被定义为 S3 类,同样由属性定义。这次属性被称为“类”。

S3 系统是 OOP 的一个非常初级的实现:没有正式的类定义,因此实例的类仅由属性定义。通用函数,如 print() , summary()等等看那个类的属性,然后搜索那个类的具体方法。

请注意属性如何是一个命名列表,其中包含有关对象的额外信息。在数据框的情况下,这是类属性本身旁边的行和列名称:
> class(iris)
[1] "data.frame"
> attributes(iris)
$names
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
$row.names
[1] 1 2 3 4 5 ...
$class
[1] "data.frame"
> class(iris) <- NULL
> class(iris)
[1] "list"

S3 类的其他实例也由该属性“类”定义。例如,如果你做一个线性模型,输出是一个带有类属性的列表,它是类“lm”。删除 class 属性会为您留下一个命名列表。

当谈到 S4 时,事情变得有点复杂。但同样,S4 对象是一个类似列表的结构,其中每个插槽都是该“列表”的“元素”。请注意,您不能像使用 S3 类那样删除某个属性来获得普通列表。 S4 的定义更严格,因此作者表达的一般思想不适用于 S4 对象。

回答你关于向量和矩阵的问题:向量在 R 中没有维度。或者更准确地说:它没有维度属性。您可以添加一个,但最终会得到一个一维数组。它们的行为与向量非常相似,但并非总是如此。所以矩阵在内部是一个带有一小段额外信息的向量。我不会称其为“向量的特例”,但矩阵确实是从向量派生而来的,而不是相反。

关于r - 为什么类被认为是 R 中向量的特例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46789658/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com