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

标签 r

我正在阅读 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/

相关文章:

android - 提取GPS信息到 "steady"和 "Moving"

R 在经过一定时间后结束重复语句

r - 具有各种 IF 的矢量,加法和减法

r - install.packages : cannot remove prior installation of package ‘DBI’ 中出现错误

r - 当日期范围跨越日历年的变化时,将行分成两行

r - 添加条件以在 R 中扩展网格?

r - knitr 中带下划线的内联代码

R ggplot : specify aes by index

r - k 表示聚类限制?

r - 从开始/结束间隔点展开一系列有序代码