2017-10-17 74 views
4

我正在閱讀Hands-on Programming with R。作者寫了以下段落 -爲什麼類被認爲是R中向量的特例?

類是一個原子向量的特例。例如,矩陣 矩陣是雙向量的特例。 矩陣中的每個元素仍然是雙精度元素,但是元素已經排列成一個新的結構 。當您更改其維度時,R添加了一個類屬性。這個課程描述了die的新格式。許多R函數 將專門查找對象的類屬性,然後 根據屬性以預定方式處理對象。

從我的理解,不應該這個說法是周圍的其他方式 - 向量是矩陣的一個特例,因爲它的尺寸爲Nx1,而不是NxM。相似性,不應該是一個類的特例,因爲矢量類有NULL類。

爲什麼不是這樣?

+6

「一個類是原子向量的特例。」這只是無稽之談(有許多類不是原子向量,原子向量沒有類屬性)。我解釋了R如何實現數組:https://stackoverflow.com/a/33982741/1412059 – Roland

+0

@羅蘭感謝您的指針。即使是語言規範也支持這樣的事實,即該類只是具有dimname屬性的向量。你能否提到一些不是原子載體的類? – kusur

+1

不,一個類是具有類屬性的R對象(或其中一個隱式類,如「矩陣」或「數字」)。例子很多,但是,作爲一個例子,data.frame是一個帶有類屬性「data.frame」的列表(而「list」是一個隱式類)。 – Roland

回答

3

作者所引用的(以不良的方式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中沒有維度,或者更精確一點:它沒有維度屬性。你可以添加一個,但是最後你會得到一個一維數組。它們的表現與矢量非常相似,但並非總是如此。所以矩陣在內部是一個向量,只有一小塊額外的信息。我不會稱之爲「矢量的一個特例」,但確實是矩陣是從矢量派生出來的,而不是相反的。

相關問題