作者所引用的(以不良的方式imho)是對象的內部表示。它們都是某種類型的「列表」,它包含額外的信息位,用於定義R如何處理它。
以矩陣爲例。矩陣是一個帶有稱爲「暗淡」的額外屬性的向量。正是這個屬性使它成爲一個矩陣。刪除屬性,顯示下面的向量結構:
> 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類的其他實例也按該屬性「類」中定義。例如,如果你做一個線性模型,輸出是一個帶有class屬性的列表,使它成爲類「lm」。刪除class屬性會留下一個命名列表。
在談論S4時,情況會變得更加複雜。但是S4對象又是一個類似列表的結構,其中每個插槽都是該「列表」的「元素」。請注意,您無法刪除某個屬性,從而無法像使用S3類一樣訪問正常列表。 S4的定義更加嚴格,因此作者所表達的總體思想不適用於S4對象。
要回答你有關向量和矩陣的問題:一個向量在R中沒有維度,或者更精確一點:它沒有維度屬性。你可以添加一個,但是最後你會得到一個一維數組。它們的表現與矢量非常相似,但並非總是如此。所以矩陣在內部是一個向量,只有一小塊額外的信息。我不會稱之爲「矢量的一個特例」,但確實是矩陣是從矢量派生出來的,而不是相反的。
「一個類是原子向量的特例。」這只是無稽之談(有許多類不是原子向量,原子向量沒有類屬性)。我解釋了R如何實現數組:https://stackoverflow.com/a/33982741/1412059 – Roland
@羅蘭感謝您的指針。即使是語言規範也支持這樣的事實,即該類只是具有dimname屬性的向量。你能否提到一些不是原子載體的類? – kusur
不,一個類是具有類屬性的R對象(或其中一個隱式類,如「矩陣」或「數字」)。例子很多,但是,作爲一個例子,data.frame是一個帶有類屬性「data.frame」的列表(而「list」是一個隱式類)。 – Roland