3.2 屬性
屬性是附加給原子型向量的額外信息,可以將屬性賦予一個原子型向量(或者任意一個R對象)。屬性并不會影響這個對象的取值,在顯示該對象時也不會出現屬性信息。你可以把屬性理解為對象的元數據(metadata),它的作用是將與這個對象相關的信息以一種便捷的形式存起來并附加給該對象。通常來說,R會選擇忽略這些元數據信息,但某些R函數會檢查對象是否附有某些特定的屬性值。這些函數會根據該數據對象的特定屬性信息決定是否進行某些特定的操作。
用attributes函數可以查看一個對象包含哪些屬性信息。如果一個對象沒有任何屬性信息,attributes會返回結果NULL,即空值。像die這樣的原子型向量,除非人為地加上一些屬性,否則它不附帶任何屬性值。
attributes(die)
## NULL
NULL
R用NULL來表示空值,意即沒有任何信息。某些R函數會返回NULL值,因為它們沒有明確定義返回值。你也可以自己生成一個NULL對象,只需要鍵入NULL即可,記得全是大寫字母。
3.2.1 名稱屬性
一個原子型向量最常見的三種屬性是:名稱(name)、維度(dim)和類(class)。每種屬性都有自己的輔助函數,以將相應的屬性附加給某個R對象。對于某些附有屬性的R對象,還可以使用這些輔助函數查詢它們所包含的屬性具體是什么。例如,可以用輔助函數names查詢die對象的名稱屬性。
names(die)
## NULL
返回值為NULL表明die對象沒有名稱屬性。利用輔助函數,可以將一串字符向量賦給die對象,作為它的名稱屬性值。這個字符向量的長度應該與die等長,每個字符元素都對應die中相應位置元素的名稱。
names(die) <- c("one", "two", "three", "four", "five", "six")
現在,die對象就具有了名稱屬性。
names(die) ## "one" "two" "three" "four" "five" "six" attributes(die) ## $names ## [1] "one" "two" "three" "four" "five" "six"
當顯示die向量時,名稱屬性值會顯示在對應元素的上方,如下所示。
die ## one two three four five six ## 1 2 3 4 5 6
然而,名稱屬性值并不會對向量中的實際值產生影響,即便是改變了向量中元素的取值,名稱屬性值也不會改變。
die + 1 ## one two three four five six ## 2 3 4 5 6 7
可以使用names函數批量修改或者刪除某個對象的名稱屬性。要更改名稱屬性,只要將新的名稱賦給names函數即可。
names(die) <- c("uno", "dos", "tres", "quatro", "cinco", "seis") die ## uno dos tres quatro cinco seis ## 1 2 3 4 5 6
要想一次性刪除名稱屬性值,需要將NULL賦給names函數。
names(die) <- NULL
die
## 1 2 3 4 5 6
3.2.2 維度屬性
原子型向量可以轉換成一個n維數組(array),方法是用dim函數將相應的維度屬性賦給該向量。具體來說,就是把這個向量的dim屬性設定為n。R會將該向量中的元素重新排列到n維。每一個維度上可以包含的行數(或者列數,等等)至多等于這個向量的第n個元素。比如說,可以將向量die重新組織成一個2×3的矩陣(含有兩行三列)。
dim(die) <- c(2, 3) die ## [,1] [,2] [,3] ## [1, ] 1 3 5
## [2, ] 2 4 6
或者將其重新組織成一個3×2的矩陣(含有三行兩列),如下所示。
dim(die) <- c(3, 2) die ## [,1] [,2] ## [1, ] 1 4 ## [2, ] 2 5 ## [3, ] 3 6或者將其重新組織成一個1×2×3的超立方體(其中含有一行、兩列和三個切片)。這樣的數據結構是三維的,但在二維的計算機屏幕上展示時,R需要一個切片一個切片地展示,如下所示。
dim(die) <- c(1, 2, 3) die ## , , 1 ## ## [,1] [,2] ## [1, ] 1 2 ## ## , , 2 ## ## [,1] [,2] ## [1, ] 3 4 ## ## , , 3 ## ## [,1] [,2] ## [1, ] 5 6
在分配維度屬性時,R始終將第一個值賦給行數,將第二個值賦給列數。總的來說,R對行列進行維度操作時,行的優先權要高于列。
你也許注意到了,R在將元素重新排列到不同的行和列時,我們能干涉的程度很小。比如說,R會先將矩陣的第一列排滿,再跳到第二列進行排列。這樣的重新排列是以列為優先順序的,而不是以行。如果想人為控制這樣的排列過程,可以使用輔助函數matrix或array。它們實現的功能與dim一樣,但包含一些額外的參數,用于控制上述過程。
- Progressive Web Apps with React
- ASP.NET MVC4框架揭秘
- JavaScript:Functional Programming for JavaScript Developers
- Learning RabbitMQ
- Practical Data Science Cookbook(Second Edition)
- C/C++算法從菜鳥到達人
- INSTANT Weka How-to
- PHP 編程從入門到實踐
- Silverlight魔幻銀燈
- Hands-On Full Stack Development with Go
- Spring核心技術和案例實戰
- Java EE企業級應用開發教程(Spring+Spring MVC+MyBatis)
- uni-app跨平臺開發與應用從入門到實踐
- Managing Microsoft Hybrid Clouds
- App Inventor少兒趣味編程動手做