1. 程式人生 > >R語言函式的含義與用法,實現過程解讀

R語言函式的含義與用法,實現過程解讀

R的源起

R是S語言的一種實現。S語言是由 AT&T貝爾實驗室開發的一種用來進行資料探索、統計分析、作圖的解釋型語言。最初S語言的實現版本主要是S-PLUS。S-PLUS是一個商業 軟體,它基於S語言,並由MathSoft公司的統計科學部進一步完善。後來Auckland大學的Robert Gentleman 和 Ross Ihaka 及其他志願人員開發了一個R系統。R的使用與S-PLUS有很多類似之處,兩個軟體有一定的相容性。

R is free

R是用於統計分析、繪圖的語言和操作環境。R是屬於GNU系統的一個自由、免費、原始碼開放的軟體,它是一個用於統計計算和統計製圖的優秀工具。
R是一套完整的資料處理、計算和製圖軟體系統。其功能包括:資料儲存和處理系統;陣列運算工具(其向量、矩陣運算方面功能尤其強大);完整連貫的統計分析工具;優秀的統計製圖功能;簡便而強大的程式語言:可操縱資料的輸入和輸入,可實現分支、迴圈,使用者可自定義功能。
R是一個免費的自由軟體,它有UNIX、Linux、MacOS和WINDOWS版本,都是可以免費下載和使用的,在那兒可以下載到R的安裝程式、各種外掛程式和文件。在R的安裝程式中只包含了8個基礎模組,其他外在模組可以通過CRAN獲得。
R的特點

(1) 有效的資料處理和儲存機制。
(2) 擁有一整套陣列和矩陣的操作運算子。
(3) 一系列連貫而又完整的資料分析中間工具。
(4) 圖形統計可以對資料直接進行分析和顯示,可用於多種圖形裝置。
(5) 一種相當完善、簡潔和高效的程式設計語言。它包括條件語句、迴圈語句、使用者自定義的遞迴函式以及輸入輸出介面。
(6) R語言是徹底面向物件的統計程式語言。
(7) R語言和其它程式語言、資料庫之間有很好的介面。
(8) R語言是自由軟體,可以放心大膽地使用,但其功能卻不比任何其它同類軟體差。
(9) R語言具有豐富的網上資源

一   入門訓練

1. 獲取幫助
    > help.start() 開啟幫助文件
    >help(solve) 顯示某命令的幫助資訊,或者
    >?solve
    對於由特殊字元指定的功能,這些引數必須用單引號或雙引號括起來,使之成為一個“字串”,如
    > help("[[")
    與某個主題相關的例子通常可以用下面的命令得到
    > example(topic)

2. 命令簡介
    R對大小寫是敏感的;名稱不能以數字開始;
    基本的命令由表示式或者賦值語句組成。如果一個表示式被作為一條命令給出,它將被求值、列印而表示式的值並不被儲存。一個賦值語句同樣對錶達式求值之後把表示式的值傳給一個變數,不過並不會自動的被打印出來;
    命令由分號(;)來分隔,或者另起新行;
    基本命令可以由花括號(f和g)合併為一組複合表示式;
    註釋幾乎可以被放在任何地方,只要是以井號( # )開始,到行末結束;
    如果一個命令在行莫仍沒有結束,R將會給出一個不同的提示符,預設的是‘+’。


3. 命令檔案的執行和輸出轉向到檔案

如果命令儲存於一個外部檔案中,比如工作目錄work中的commands.R,他們可以隨時在R的任務中被執行
> source("commands.R")在Windows中Source也可以由File選單執行。
函式sink,
> sink("record.lis")
將把所有後續的輸出由終端轉向一個外部檔案,record.lis。命令
> sink()   將把資訊重新恢復到終端上。

4. 資料的保持與物件的清除

R所建立、操作的實體是物件。物件可以是變數、陣列、字串、函式以及由這些元素組成的其它結構;
> objects()     用來顯示目前儲存在R中的物件的名字。而當前儲存的所有物件的組合被稱為workspace;
清除物件可以使用rm命令:
> rm(x, y, z, ink, junk, temp, foo, bar)
所有在一個R任務中被建立的物件都可以在檔案中被永久儲存,並在其它的R任務中被使用。在每個R任務結束時使用者都有機會儲存當前有效的所有物件。如果使用者這樣做的話,物件將被寫入當前目錄一個名為.RData。當R被再次啟動時R會從這個檔案中再載入workspace。同時相關的命令記錄也被載入。
所以,推薦大家在用R進行不同的分析時分別使用不同的工作目錄。

5. 基本資料結構

數值型(numeric)

1,1.2,3.1415926


複數型(complex)


1+2i


字元型(character)


‘A’/ “hello world!”


邏輯型(logical)


TRUE / FALSE

6. 基本資料物件

向量(vector), 見下節
矩陣(matrix):
更一般的說陣列是向量在多維情況下的一般形式。事實上它們是可以被兩個或更多的指標索引的向量,並且以特定的方式被打印出來。
因子(factors) 提供了一種處理分類資料的更簡介的方式。
列表(list): 
是向量的一種一般形式,並不需要保證其中的元素都是相同的型別,而且其中的元素經常是向量和列表本身。
資料框(data frame):
是一種與矩陣相似的結構,其中的列可以是不同的資料型別。可以把資料框看作一種資料"矩陣",它的每行是一個觀測單位,而且(可能)同時包含數值型和分類的變數。
函式( function):
能夠在R的workspace中儲存的物件。我們可以通過函式來擴充套件R的功能。

二   簡單操作,數值與向量

2.1 向量與賦值

R對命名了的資料結構進行操作。最簡單的資料結構是數字向量;如,
> x <- c(10.4, 5.6, 3.1, 6.4, 21.7)    c()是建立函式,賦值運算子是'<-',與函式assign()等價
> assign("x", c(10.4, 5.6, 3.1, 6.4, 21.7))  也可以寫成:
> c(10.4, 5.6, 3.1, 6.4, 21.7) -> x
如果一個表示式被當作一個完整的命令,它的值將被列印到終端但不被儲存。
單獨輸入x則會將值打印出來。也可以列印倒數:
> 1/x
> y <- c(x, 0, x)   也可以將向量作為元素。

2.2 向量運算

    操作是按照向量中的元素一個一個進行的。同一個表示式中的向量並不需要具有相同的長度。如果它們的長度不同,表示式的結果是一個與表示式中最長向量有相同長度的向量。表示式中較短的向量會根據它的長度被重複使用若干次(不一定是整數次),直到與長度最長的向量相匹配。而常數很明顯的將被不斷重複。如,
> v <- 2*x + y + 1
常用運算有:
+,-,*,/,^(次方);
log, exp, sin, cos, tan,sqrt等;
max和min的作用是選出所給向量中最大的或最小的元素;
range函式的值是一個長度為2的向量,即c(min(x),max(x))
length(x)返回了向量x中元素的個數,也就是x的長度。
sum(x)給出了x中所有元素的總和;
prod(x)給出x中所有元素的乘積;
mean(x)和var(x),分別計算樣本均值和樣本方差,這兩個函式分別相當於sum(x)/length(x),sum((x-mean(x)) \^2)/(length(x) -1)。如果var()的引數是一個n*p的矩陣,那麼函式的值是一個p*p的樣本協方差矩陣,認為每行是一個p變數的樣本向量。
sort(x)返回一個與x具有相同長度的向量,其中的元素按招升序排列。還有其他更靈活的排序功能(參見order()和sort.list())。
pmax和pmin將返回一個與最長的向量長度相等的向量,向量中的元素由引數中所有向量在相應位置的最大值(最小值)組成;
如果要使用複數,需要直接給出一個複數部分。因此sqrt(-17)將會返回NaN(無效數值)和一個警告,而sqrt(-17+0i)將按照複數進行運算。

2.3 生成序列

最簡單的方法是用冒號‘:’,冒號具有最高運算優先順序。例如1:30就是向量c(1,2,. . .,29,30)。30:1構造一個遞減序列。
利用seq()函式構造序列:有五個引數,from, to, by, length, along
                                       from, to可以不寫引數名,seq(2,10)就相當於2:10。
                                       by指定步長,預設為1,如seq(-5, 5, by=.2)即為c(-5.0, -4.8, -4.6, ..., 4.6, 4.8, 5.0)
                                       length指定序列長度,如seq(length=51, from=-5, by=.2),等同於seq(-5, 5, by=.2)
                                       along=vector只能單獨使用,產生一個“1:length(vector)”序列。類似的函式是rep(),這個函式可以用多種複雜的方法來                         
                                           複製一個物件。最簡單的形式是> s5 <- rep(x, times=5)

2.4 邏輯向量


TRUE, FALSE, 和NA(not available), 前兩個可以簡寫為T和F,但T/F並不是系統保留字,可以被使用者覆蓋,所以最好還是不要簡寫。
邏輯向量是由條件給出的,如下列語句令temp成為一個與x長度相同,相應位置根據是否與條件相符而由TRUE或FALSE組成的向量:
> temp <- x > 13
邏輯操作符包括<, <=, >, >=,完全相等==和不等於!=,與或非分別為&, |, !。
在普通運算中,FALSE當做0而TRUE當做1。

2.5 缺失值

NA(not available): 一般來講一個NA的任何操作都將返回NA。
     is.na(x)返回一個與x等長的邏輯向量,並且由相應位置的元素是否是NA來決定這個邏輯向量相應位置的元素是TRUE還是FALSE。
     x==NA是一個與x具有相同長度而其所有元素都是NA的向量。
NaN(Not a Number): 由數值運算產生,如0/0, Inf-Inf.
     is.na(x)對於NA和NaN值都返回TRUE,
     is.nan(x)只對NaN值返回TRUE。

2.6 字元向量


字串在輸入時可以使用單引號(')或雙以號(");  在列印時用雙引號(有時不用引號)。
R使用與C語言風格基本相同的轉義符, 所以輸入\\列印的也是\\, 輸入\" 列印引號",  \n: 換行, \t: tab, \b: 回格。
字元向量可以通過函式c()連線;
paste()可以接受任意個引數,並從它們中逐個取出字元並連成字串,形成的字串的個數與引數中最長字串的長度相同。如果引數中包含數字的話,數字將被強制轉化為字串。在預設情況下,引數中的各字串是被一個空格分隔的,不過通過引數sep=string 使用者可以把它更改為其他字串,包括空字串。例如:
> labs <- paste(c("X","Y"), 1:10, sep="")  使變數labs成為字元變數c("X1", "Y2", "X3", "Y4", "X5", "Y6", "X7", "Y8", "X9", "Y10")

2.7 index vector---資料集子集的選擇與修改


任何結果為一個向量的表示式都可以通過追加索引向量(index vector)來選擇其中的子集。
1 邏輯的向量。
> y <- x[!is.na(x)]    表示將向量x中的非NA元素賦給y;
> (x+1)[(!is.na(x)) & x>0] -> z     表示建立一個物件z,其中的元素由向量x+1中與x中的非缺失值和正數對應的向量組成。
2. 正整數的向量
> x[6]    是x的第六個元素
> x[1:10]       選取了x的前10個元素(假設x的長度不小於10)。
> c("x","y")[rep(c(1,2,2,1), times=4)]     產生了一個字元向量,長度為16,由"x", "y", "y", "x"重複4次而組成。
3. 負整數的向量
> y <- x[-(1:5)]       表示向量y取向量x前5個元素以外的元素。
4. 字串的向量
只存在於擁有names屬性並由它來區分向量中元素的向量。這種情況下一個由名稱組成的子向量起到了和正整數的索引向量相同的效果。
> fruit <- c(5, 10, 1, 20)
> names(fruit) <- c("orange", "banana", "apple", "peach")
> lunch <- fruit[c("apple","orange")]
子集的修改
> x[is.na(x)] <- 0    表示將向量x中所以NA元素用0來代替
> y[y < 0] <- -y[y < 0]      表示將向量(-y)中 與向量y的負元素對應位置的元素 賦值給 向量y中 與向量y負元素對應的元素。作用相當於:
> y <- abs(y)

三  物件,模式和屬性

3.1 固有屬性:模式和長度

物件是R所進行操作的實體,物件可以是向量、列表等,詳見1.6.
物件的模式包括numeri,ccomplex,character,logical,list,function,expression等。可以用mode(object)檢視。
物件的長度是物件的另一固有屬性。可以用length(object)檢視。
attribute(object)可以檢視更深入的屬性。

模式的轉換
在允許的情況下(大多數情況都是允許的),R可以完成各種模式的轉換。例如:d<-as.character(z),將數值向量z<-(0:9)轉化為字元向量c("0", "1", "2", ..., "9")。as.integer(d)將d轉化為數值向量。
R中很多形式為as.something()的函式,可以完成從一個模式向另一個模式的轉化,或者是令物件取得它當前模式不具有的某些屬性。

3.2 改變物件的長度

> e <- numeric()    產生一個numeric型的空向量e。character()等類似。此時長度為物件0。
此時新新增一個元素會使e的長度自動調整。
> e[3] <- 17    令e為一個長度為3的向量(此時,該向量的前兩個元素都是NA)
縮短(截斷)一個物件的長度,只需要一個賦值命令。因此,若alpha是一個長度為10的物件,下面的命令
> alpha <- alpha[2 * 1:5]

3.3 屬性的獲取和設定


函式attributes(object)將給出當前物件所具有的所有非基本屬性(長度和模式屬於基本屬性)的一個列表。
函式attr(object,name)可以被用來選取一個指定的屬性。除了為某些特殊的目的建立新屬性這樣特殊的環境下,這些函式很少被用到。
當函式attr()用在賦值語句左側時,既可以是將物件與一種新的屬性關聯,也可以是對原有屬性的更改。例如
> attr(z,"dim") <- c(10,10)         另R將z作為一個10X10的矩陣看待。

3.4 物件的類別

物件的一個特別屬性,類別,被用來指定物件在R程式設計中的風格。比如:如果物件類別"data.frame"則會以特定方式處理。
unclass()可以去除物件的類別。
summary()可以檢視物件的基本資訊(min, max, mean, etc.)

四  有序因子和無序因子


因子是一種向量物件,它給自己的元件指定了一個離散的分類(分組),它的元件由其他等長的向量組成。R提供了有序因子和無序因子。
通俗點說,因子就是將物件的值分成不同的組(levels)。
用函式factor()建立一個因子,levels按序排列(字母序或數值序)。

例如province<-c("四川","湖南","江蘇","四川","四川","四川","湖南","江蘇","湖南","江蘇"),為province建立因子:
> pf<-factor(province)   建立province的因子pf
> pf     打印出來
 [1] 四川 湖南 江蘇 四川 四川 四川 湖南 江蘇 湖南 江蘇
Levels: 湖南 江蘇 四川
函式levels()可以用來觀察因子中有多少不同的levels。

假如我們擁有這些省份考生的分數:
> score<-c(95,86,84,92,84,79,86,99,85,90)
函式tappley()可以用來計算各省的平均分數,函式tapply()的作用是對它第一個引數的元件中所包含的每個組應用一個引數三指定的函式。
> smeans<-tapply(score,pf,mean)
> smeans
    湖南     江蘇     四川
85.66667 91.00000 87.50000
再例如,下面命令會給出各組的length
> tapply(score,pf,length)
湖南 江蘇 四川
   3    3    4


函式ordered()可以建立有序因子
> ordered(province)
 [1] 四川 湖南 江蘇 四川 四川 四川 湖南 江蘇 湖南 江蘇
Levels: 湖南 < 江蘇 < 四川


五 陣列和矩陣

5.1 陣列

陣列可以看成一個由遞增下標表示的資料項的集合,例如數值。
陣列的生成
如果一個向量需要在R中以陣列的方式被處理,則必須含有一個維數向量作為它的dim屬性。
維度向量由dim()指定,例如,z是一個由1500個元素組成的向量。下面的賦值語句
> dim(z) <- c(3,5,100)        使它具有dim屬性,並且將被當作一個3X5X100的陣列進行處理。 c(3,5,100) 就是他的維度向量。
還可以用到像matrix()和array()這樣的函式來賦值。比如
> array(1:20, dim=c(4,5))
> matrix(1:24, 3,4)
資料向量中的值被賦給陣列中的值時,將遵循與FORTRAN相同的原則"主列順序",即第一個下標變化的最快,最後的下標變化最慢。
陣列的運算
陣列可以在算數表示式中使用,結果也是一個數組,這個陣列由資料向量逐個元素的運算後組成,通常參與運算的物件應當具有相同的dim屬性。

5.2 陣列的索引和陣列的子塊


陣列中的單個元素可以通過下標來指定,下標由逗號分隔,寫在括號內。
我們可以通過在下標的位置給出一個索引向量來指定一個數組的子塊,不過如果在任何一個索引位置上給出空的索引向量,則相當於選取了這個下標的全部範圍。
如a[2,,],a[,3,]等

5.3 索引陣列

除了索引向量,還可以使用索引陣列來指定陣列的某些元素。
例如:有4X5的陣列a,若要得到a中的a[1,3], a[2,2] 和a[3,1]這三個元素,可以生成索引向量i,然後用a[i]得到它們。
> a <- array(1:20,dim=c(4,5)) # Generate a 4 by 5 array.
> i <- array(c(1:3,3:1),dim=c(3,2))
> i
[,1] [,2]
[1,] 1 3
[2,] 2 2
[3,] 3 1
> a[i]
[1] 9 6 3
> a[i] <- 0   # 將這三個元素用0替換。

5.4 向量,陣列的混合運算

表示式從左到右被掃描;
參與運算的任意物件如果大小不足,都將被重複使用直到與其他參與運算的物件等長;
當較短的向量和陣列在運算中相遇時,所有的陣列必須具有相同的dim屬性,否則返回一個錯誤;
如果有任意參與運算的向量比參與運算的矩陣或陣列長,將會產生錯誤;
如果陣列結構正常聲稱,並且沒有錯誤或者強制轉換被應用於向量上,那麼得到的結果與參與運算的陣列具有相同的dim屬性。

5.5 矩陣的運算

構建分割槽矩陣:cbind()和rbind(),cbind()按照水平方向,或者說按列的方式將矩陣連線到一起。rbind()按照垂直的方向,或者說按行的方式將矩陣連線到一起。


外積:操作符是%o%:
> ab <- a %o% b   或者
> ab <- outer(a, b, "*")
其中的乘法操作可以由任意一個雙變數的函式替代。

廣義轉置:函式t(A),或aperm(A, c(2,1));


獲取行數/列數:nrow(A)和ncol(A)分別返回矩陣A的行數和列數。

矩陣乘法:操作符為%*%;

交叉乘積(cross product):crossprod(X,Y)等同於t(X) %*% y,crossprod(X)等價於crossprod(X, X);

diag(v):如果v是向量,diag(v)返回一個由v的元素為對角元素的對角矩陣。
               如果v為矩陣,diag(v)返回一個由v主對角元素組成的向量。
               如果v只是一個數值,那麼diag(v)是一個vXv的單位矩陣。


特徵值和特徵向量:eigen(Sm)。這個函式的結果是由名為values和vectors的兩部分組成的列表。如果只是需要特徵值:eigen(Sm)$values

最小二乘擬合即QR分解:lsfit(), qr()。

強制轉換為向量:as.vector(),或者直接c().

解線性方程和求矩陣的逆,奇異值分解與行列式見<R語言筆記>;

六  列表和資料幀

6.1 列表

列表是由稱作元件的有序物件集合構成的物件。元件的模式或型別不一定相同。
形如Lst <- list(name_1=object_1, . . ., name_m=object_m)的賦值將建立一個包含m個元件的列表,並根據引數中指定的名稱為其命名。(其名稱可以自由選取)。如果它們的名稱被省略,元件將只是被編號。例如:
> Lst <- list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9))

所使用的元件是被複制到新的列表中的,對原始物件沒有影響。
元件總是被編號的,並且可以通過編號指定。
Lst[[1]] 即為"Fred",也可以用 Lst$name,Lst[["name"]]指定。如果Lst[[4]]是一個有下標的陣列,Lst[[4]][1]就是它的第一項。
區分Lst[[1]]和Lst[1],'[[...]]'是選擇單個元素時使用的操作符,而'[...]'是一個一般的下標操作符。因此,前者代表列表Lst中的第一個物件;後者是列表Lst的子列表,僅包含列表的第一項。
元件的名稱可以縮寫,可縮寫的程度是隻要能令元件被唯一的識別就可以了。如:Lst$na等價於Lst$name, Lst$w等價於Lst$wife。

擴充套件列表
可以通過指定額外元件的方式。例如
> Lst[5] <- list(matrix=Mat)

連線列表
當連線函式c()的引數為列表時,其結果也是一個模式為列表的物件。由引數中的列表作為元件依次連線而成。
> list.ABC <- c(list.A, list.B, list.C)

6.2 資料幀


資料幀是類別為"data.frame"的列表;
資料幀會被當作各列具有不同模式和屬性的矩陣。
資料幀按照矩陣的方式顯示,選取的行或列也按照矩陣的方式來索引。

建立資料幀

直接建立:那些滿足對資料幀的列(元件)限制的物件可以通過函式data.frame來構建成為一個數據幀
> t <- data.frame(home=statef, loot=income, shot=incomef)
強制轉換:如果一個列表的元件與資料幀的限制一致,這個列表就可以通過函式as.data.frame()強制轉化為一個數據幀。
外部檔案:建立資料幀最簡單的方法應當是使用read.table()函式從外部檔案中讀取整個資料幀。

資料幀和列表的限制


1 元件必須是向量(數值型,字元形,邏輯型),因子,數值矩陣,列表,或其他資料幀;
2 矩陣,列表,資料幀向新資料幀提供的變數數分別等於它們的列數,元素數和變數數;
3 數值向量,邏輯值和因子在資料幀中保持不變,字元向量將被強制轉化為因子,其水平是字元向量中所出現的值;
4 資料幀中作為變數的向量結構必須具有相同的長度,而矩陣結構應當具有相同的行大小。


掛接和解除安裝資料幀

當覺得使用'$'引用資料幀元素(如't$home')麻煩時,可以進行資料幀掛接
> attach(t)      這樣可以直接引用資料幀內的元素,而無需'$',前提是資料幀外沒有同名的變數(如name)。
掛接後若要對資料幀元素進行賦值操作,仍需用'$',否則視為賦值給資料幀外的元素。
賦值後必須要先解除安裝(detach)再重新掛接後,新值才可見。
> detach(t)


attach()是具有一般性的函式,即它不僅能夠將目錄和資料幀掛接在搜尋路徑上,還能掛接其他類別的物件。特別是模式為"list"的物件可以通過相同的方式掛接:
> attach(any.old.list)    
任何被掛接的物件都可以用detach來解除安裝,通過指定位置編號或者指定名稱這樣的方式.

搜尋路徑
函式search()將顯示目前的搜尋路徑,可以用來檢視資料幀/列表的掛接狀態。
ls()(或objects())命令可以用來檢查搜尋路徑任意位置上的內容。如:ls(), ls(2), ls(t)
R可以在搜尋路徑中包含至多20個專案,列表和資料幀只能在位置2或更靠後的位置上掛接。


資料幀使用慣例


1 將每個獨立的,適當定義的問題所包含的所有變數收入同一個資料幀中,並賦予合適的、易理解、易辨識的名稱;
2 處理問題時,當相應的資料幀掛接於位置2,同時在第1層工作目錄下存放操作的數值和臨時變數;
3 在結束一次工作之前,將你認為對將來有參考價值的變數通過$標記的形式新增到資料幀裡面,然後detach();
4 最後,將工作目錄下所有不需要的變數剔除,並且儘量將剩下多餘的臨時變數都清除乾淨。
這樣我們可以很簡單的在同一個目錄下處理多個問題,而且對每個問題都可以使用x,y,z這樣的變數名。

七  從檔案中讀取資料

7.1 函式read.table()

該函式可以直接將檔案中完整的資料幀讀入。此時檔案要符合特定的格式:
1 第一行應當提供資料幀中每個變數的名稱;
2 每一行(除變數名稱行)應包含一個行標號和各變數的值。
3 若沒有表頭(變數名稱行),也沒有行標號,只有變數值,則預設變數名稱為"v1","v2"...
4 若有表頭,但沒有行標號,則可以指定引數header=TRUE.

7.2 函式scan()

該函式從鍵盤或檔案中讀取資料,並存入向量或列表中。
> inp <- scan(file, what)
第一個引數是檔名,如“test.txt”,若為“”或空,則從鍵盤讀入資料;
第二個引數用於確定讀入資料的模式。  如:list("",0,0) 指定讀入到列表中,列表有三項,且列表第一項是字元型,第二三項是數值型。若為0,則指定讀入到一個數值向量中,若為“”則指定讀入到字元向量中。

7.3 內建資料集的讀取


R本身提供超過50個數據集,同時在功能包(包括標準功能包)中附帶更多的資料集。與S-Plus不同,這些資料即必須通過data函式載入。
> data()   #獲得基本系統提供的資料集列表,然後通過形如
> data(infert)    #來載入名為infert的資料集
從其他package中載入資料集
data(package="nls")      #檢視nls中資料集
data(Puromycin, package="nls")     #讀取nls中Puromycin資料集。
用library()掛接package後,它的資料集也自動包含到搜尋路徑中了。
library(nls)    #載入package nls
data()      #檢視資料集
date(Puromycin)    #載入Puromycin資料集

7.4  編輯資料

在使用一個數據幀或矩陣時,edit提供一個獨立的工作表式編輯環境。
> xnew <- edit(xold)       #對資料集xold進行編輯。並在完成時將改動後的物件賦值給xnew
> xnew <- edit(data.frame())        #可以通過工作表介面錄入新資料。

fix()函式用於直接修改已有的物件,等價於  x<-edit(x).

八 概率分佈

8.1 R是一個統計表集合(略讀)


R提供了一套完整的統計表集合。函式可以對累積分佈函式P(X<=x),概率密度函式,分位函式(對給定的q,求滿足P(X<=x) > q的最小x)求值,並根據分佈進行模擬。

對於所給的名稱,加字首'd'代表密度(density),'p'代表CDF,'q'代表分位函式,'r'代表模擬(隨即散佈)。這幾類函式的第一個引數是有規律的,形為dxxx的函式為x,pxxx的函式為q,qxxx的函式為p,rxxx的函式為n(rhyper和rwilcox是特例,他們的第一個引數為nn)。目前為止,非中心引數(non-centrality parameter)僅對CDF和少數幾個其他函式有效,細節請參考線上幫助。
所有pxxx和qxxx的函式都具有邏輯引數lower.tail和log.p,而所有的dxxx函式都有引數log,這個是我們可以直接通過
- pxxx(t, ..., lower.tail = FALSE, log.p = TRUE)
獲取,比如說,累積失效函式(cumulative/integrated hazard function),H(t) =-log(1-F(t)),以及更精確的對數似然(通過dxxx(..., log = TRUE))。
此外,對於來自正態分佈,具有學生化樣本區間的分佈還有ptukey和qtukey這樣的函式。下面是一些例子
> ## 2-tailed p-value for t distribution
> 2*pt(-2.43, df = 13)
> ## upper 1% point for an F(2, 7) distribution
> qf(0.99, 2, 7)

8.2 檢測資料集的分佈


函式summary和fivenum這兩個函式可以給出摘要,後者只給出數值;
函式stem可以將數值統計結果以類似直方圖的方式顯示出來;
函式hist()可以繪製直方圖;
函式density和line可以獲得更漂亮的密度圖;
功能包fun中的ecdf函式能繪製經驗累積分佈函式;
還可以進行擬合正態分佈,覆蓋擬合CDF;
還可以繪製Quantile-quantile (Q-Q)圖有助於我們更細緻的檢測其分佈形態;

8.3 單樣本和兩樣本檢驗(略讀)

九  語句組、迴圈和條件操作


R是一種表示式語言,也就是說其命令型別只有函式或表示式,並由它們返回一個結果。
語句組由花括號‘{ }’確定,此時結果是該組中最後一個能返回值的語句的結果。


條件語句

> if (expr_1) expr_2 else expr_3
其中條件表示式expr1必須返回一個邏輯值,操作符&&和||經常被用於條件部分。
&和|與&&,||的區別在於,&和|按照逐個元素的方式進行計算,&&和||對向量的第一個元素進行運算,只有在必需的時候才對第二個引數求值。
if/else結構的向量版本是函式ifelse,其形式為ifelse (condition,a,b),產生函式結果的規則是:如果condition[i]為真,對應a[i]元素;反之對應的是b[i]元素。根據這個原則函式返回一個由a,b中相應元素組成的向量,向量長度與其最長的引數等長。

迴圈語句

> for (name in expr_1) expr_2
其中name是迴圈變數,expr1是一個向量表示式(通常是1:20這樣的序列),而expr2經常是一個表示式語句組,expr2隨著name依次取expr1結果向量的值而被多次重複執行。

> repeat(expr)

> while(condition) expr


break語句可以用來中斷任何迴圈,可能是非正常的中斷。而且這是中止repeat迴圈的唯一方式。

next語句可以中止一個特定的迴圈,跳至下一個.

十 編寫自己的函式

10.1 函式的定義

> name <- function(arg_1, arg_2, ...) expression
expression是一個R表示式(通常是表示式語句組),並使用引數arg_i來計算出一個數值,表示式的值就是函式的返回值。
函式呼叫的形式通常都是name(expr1,expr2,...)

10.2 定義新的二元操作符

可以將函式定義為新的二元操作符:
> "%!%" <- function(X, y) { ... }
正如矩陣乘法運算子,%*%,和矩陣外積運算子%o%

10.3 指定引數和預設值


如果被呼叫函式的引數按照"name = obj"的形式給出,那麼引數的次序可以是任意的。
而且,引數序列可以在開始依次序給出,而將指定名稱的引數置於後面。
因此,如果由一個函式fun1被定義為
> fun1 <- function(data, data.frame, graph, limit) {
[function body omitted]
}
那麼函式可以有多種等價的使用方法,例如
> ans <- fun1(d, df, TRUE, 20)
> ans <- fun1(d, df, graph=TRUE, limit=20)
> ans <- fun1(data=d, limit=20, graph=TRUE, data.frame=df)
預設值 :在很多情況下,引數都會被賦予一個普遍適用的預設值。
> fun1 <- function(data, data.frame, graph=TRUE, limit=20) { ... }
則函式可以這樣被呼叫
> ans <- fun1(d, df)
此時與上面三種情況等價,也可以這樣呼叫
> ans <- fun1(d, df, limit=10)
此時改變了一個預設值。
NOTE:引數可以是任意表達式,甚至可以是包含其他引數的表示式;

10.4 額外引數“...”


當需要將一個函式的引數傳遞給另一個函式時,可以通過包含一個額外的引數"..."實現。
fun1 <- function(data, data.frame, graph=TRUE, limit=20, ...) {
[omitted statements]
if (graph)
par(pch="*", ...)
[more omissions]
}

10.5 全域性變數和區域性變數

函式內的賦值都是區域性變數,退出函式就丟失了。
如果要在函式內進行永久賦值(定義全域性變數),需要用到“超賦值”操作符, <<-或者函式assign()。

10.6 一些高階示例

區組設計的效率因子 (E±ciency factors)
刪除列印陣列中的所有名稱
遞迴的數值積分

10.7 範疇(Scope)


函式主體內出現的標識(symbol)可以被分為3類;正式引數、區域性變數和自由變數。
正式引數就是出現在函式引數列表中的引數,他們的值由實際的函式引數與正式引數的繫結(binding)過程決定。
區域性變數是在引數主體中,由表示式求值過程決定的變數。
自由變數為既不是正式引數又不是區域性變數的變數。賦值之後自由變數成為區域性變數。


在R中,自由變數的值由函式被建立的環境中與其同名的第一個變數值決定(我理解為最近的同名變數),這種方式被稱為詞彙式範疇(lexical scope)。
而在S中,該值由同名的全域性變數決定。
例如下面的函式cube,在R中cube(2)=8,在S中報錯為sq()找不到n。
cube <- function(n) {
sq <- function() n*n
n*sq()
}

一個銀行賬戶的例子,詳見《R語言筆記》。

10.8 定製環境

詳見《R語言筆記》。

10.9 類別,通用函式和物件定位


一個物件的類別(class)決定了他會如何被通用函式(generic function)處理。
如果引數本身沒有任何類別屬性,或者其類別在特定問題中並不滿足通用函式的要求,通常會有一個預設的動作被執行。
類別機制使使用者可以為特定的目的設計和編寫通用函式。
使用> methods(class="data.frame")可以檢視資料幀的通用函式。
使用> methods(plot)可以檢視plot函式能處理的類別。

十一   R的統計模型

待閱。

十二 圖形過程

在Windows下用window()命令可以開啟圖形視窗。

12.1 高階繪圖命令


    高階繪圖函式,由函式引數提供資料生成一幅完整的圖形。其中適當的座標軸,標籤和標題都自動生成了(除非你另外指定了)。高階繪圖命令每次都生成一幅新的圖形,清除當前的圖形(如果需要的話)。

1  plot()函式


這是一個通用函式:生成圖形的型別取決於第一個引數的型別或類別(class)。
plot(x,y)  plot(xy):
如果x,y是向量,plot(x,y)生成一幅y對x的散點圖。用包含兩個元素x,y的一個列表或一個兩列的矩陣作為一個引數(第二種形式那樣的)也能達成相同的效果。
plot(x):
如果x是一個時間序列,這個命令生成一個時間序列圖,如果x是一個數值型向量,則生成一個向量值對它們向量索引的土,而如果x是一個復向量,則生成一個向量中元素的虛部對實部的圖。
plot(f)   plot(f,y):
f是一個因子物件,y是一個數值型向量。第一種形式生成一個f的條形圖;第二種形式生成y對應於f各個水平的箱線圖。
plot(df)   plot( expr)    plot(y expr):
df是一個數據幀,y是任意物件,expr是由物件名稱組成的列表,分隔符'+'(例如,a + b + c)。前兩種形式生成分散式的圖形,第一種是資料幀中的變數,第二種是一系列被命名的物件。第三種形式生成y對expr中每個物件的圖。

2 顯示多元資料


如果X是一個數值矩陣或資料幀,下面的命令
> pairs(X)
生成一個配對的散點圖矩陣,矩陣由X中的每列的列變數對其他各列列變數的散點圖組成,得到的矩陣中每個散點圖行、列長度都是固定的。


當問題涉及到三、四個變數時,使用coplot更好些。如果a和b是數值向量,c是數值向量或因子物件(全都是相同長度的),下面的命令
> coplot(a ~ b | c)
對應c的某些給定值生成數個a對b的散點圖。當c是一個因子時,這個命令也就是對c的每個水平生成a對b的散點圖。當c是數值向量的時候,這個數值向量被分為一系列的條件區間(conditioning intervals),對應c的每個區間生成一個a對b的散點圖。區間的數量和位置可以通過coplot()的引數given.values來控制,函式co.intervals()也可以用來選擇區間。我們也可以使用兩個給定變數通過命令
>coplot(a ~ b | c+d)
對c和d的每個聯合條件區間生成a對b的散點圖。


函式coplot()和pairs()都可以使用引數panel=,這個引數可以用來定製我們得到的圖形型別。預設的是points()函式,生成一個散點圖,不過通過在引數panel=中提供某些其它的低階圖形函式,我們可以生成需要的各種圖形。一個很有用的函式例子是panel.smooth()。

3 顯示圖形


qqnorm(x)   qqline(x)    qqplot(x,y)
分佈比較圖。第一種形式生成向量x對期望正態分數(一個正態記分圖),第二個在上面的圖上新增一條穿過分佈分位點和資料分位點的直線。第三個命令生成x的分位點對y分位點圖,用於分別比較它們的分佈。

hist(x)     hist(x,nclass=n)       hist(x,breaks=b, . . . )
生成數值變數x的直方圖。通常會自動選定一個合理的類別數,不過可以通過nclass=引數來指定一個推薦值。或者通過引數breaks=來指定分界點。如果給定了probability=TRUE引數,那麼條形圖代表相對頻數而不是累計數。

dotchart(x, . . . )
建立一個x中資料的點圖(dotchart)。點圖中y軸給出x中資料的標籤,x軸給出它們的值。它允許對落入某一特定區間的所有資料項方便的進行視覺化選擇。

image(x,y,z, . . . )     contour(x,y,z, . . . )    persp(x,y,z, . . . )
生成三個變數的圖。函式image是用不同的顏色繪製一些矩形方格來展示z的值,函式contour通過繪製等高線來展示z的值,函式persp繪製一個3D面。

4 引數配置


add=TRUE      強制函式按照低階圖形函式的方式操作,將圖形置於當前圖形上(僅對某些函式有效)。
axes=FALSE       暫時禁止座標軸的生成|以便使用axis()函式新增你自己定製的座標軸。預設情況是axes=TRUE,即包含座標軸。
log="x"   log="y"   log="xy"      令x,y或者兩者全都對數化。這個引數對許多函式都有效,不過不是全部。
type=          引數type=控制所生成圖形的型別:
        type="p" 繪製單獨的點(預設值)
        type="l" 繪製線
        type="b" 繪製由線連線的點(both)
        type="o" 將點繪在線上
        type="h" 繪製從點到零軸的垂線(high-density)
        type="s" 階梯式圖。第一種形式中,點由垂線的頂部定義;第二種形式裡用底部定義。
        type="n" 不繪製。不過座標軸是繪出的(預設情況)而且要根據資料繪出座標系統。用來給後續的低階圖形函式建立圖形作基礎。
xlab=string    ylab=string          x軸或y軸的標籤。使用這些引數來改變預設的標籤,通常的預設值是呼叫高階繪圖函式時所使用物件的名稱。
main=string          圖表標題,位於圖形的頂部,大字型顯示。
sub=string         子標題,位於x軸下面,用較小的字型顯示。

12.2   低階繪圖命令


有些時候高階繪圖函式並不能很精確的生成我們想要的圖形。這種情況下,我們可以通過低階繪圖命令在當前圖形上新增資訊(例如,點、線或文字)。


points(x,y)    lines(x,y)
在當前圖形上新增點或線。函式plot()的引數type=也可以用於這些函式(預設的是"p"代表points()和"l"代表lines())。

text(x,y,labels, . . . )
給定點座標x,y,在該點新增文字。通常labels是一個整數或字元向量,其中labels[i]出現在點(x[i],y[i])。預設值是1:length(x)。
Note: 這個函式通常用於這樣的序列中
 > plot(x, y, type="n"); text(x, y, names)
圖形引數type="n"阻止了點的生成,但是建立了座標軸,由函式text()提供字元向量names所指定的特定字元。


abline(a, b)   abline(h=y)   abline(v=x)    abline(lm.obj)
在當前圖上新增一條斜率為b,截距為a的直線。h=y在圖形指定的高度上繪製一條貫穿圖形的水平線,同樣的,v=x在x軸的指定位置繪製一條貫穿的垂線。而lm.obj是一個包含coefficients元件的列表,該元件的長度為2,分別當作截距和斜率。

polygon(x, y, . . . )
繪製一個多邊形,其頂點由(x,y)指定。同時還(可選的)可以加上陰影線,如果圖形裝置允許的話還可以將多邊形填充。

legend(x, y, legend, . . . )
這當前圖形的指定位置新增圖例。繪製的字元,線條型別,顏色等等由字元向量legend指定。除此之外至少還要給出一個引數v,與繪圖單元的相應值,分別有:
legend( , fill=v)填充方框的顏色
legend( , col=v)繪製點線的顏色
legend( , lty=v)線條型別
legend( , lwd=v)線條寬度
legend( , pch=v)繪製字元(字元向量)


title(main,sub)
在當前圖形的頂部用大字題新增一個標題main,在底部用較小的字型新增子標題sub。

axis(side, . . . )
在當前圖形的指定邊上新增座標,在哪個邊上由第一個引數指定(1到4,從底部按照順時針順序)。其他引數控制座標的位置|在圖形內或圖形外,以及標記的位置和標籤。適合在呼叫引數為axes=FALSE的函式plot()後新增定製的座標軸。

低階繪圖函式通常都需要一些位置資訊(例如,x,y座標)來決定在哪裡新增新的元素。座標以使用者座標(user coordinates)的形式給出,這個座標系是根據所提供的資料由之前的高階繪圖語句定義的。需要x,y引數的地方還可以選用一個單獨的引數,即一個由名為x,y的元素組成的列表。相似的,一個兩列的矩陣也可以。像locator()(後面會提到)這樣的函式也可以按照這種方式互動的指定圖形中的位置。

新增數學註釋
某些情況下需要在圖形中加入數學符號或公式。在R中可以通過在text, mtext,axis或title中指定一個表示式來實現。例如,下面的程式碼繪製了二項概率函式的公式:
> text(x, y, expression(paste(bgroup("(", atop(n, x), ")"),p^x, q^{n-x})))
更多的資訊,包括其特性的一個完整列表可以在R中通過下面的命令得到:
> help(plotmath)
> example(plotmath)

新增Hershey向量字型
> help(Hershey)
> example(Hershey)

12.3 圖形的互動

R提供了函式,使使用者可以通過滑鼠從圖形中釋放資訊或新增資訊。


locator(n,type)
等待使用者使用滑鼠左鍵在當前圖形上選擇位置。直到n(預設是512)個點都選完或者點選了滑鼠另一個鍵(Unix,Windows),在Mac下用滑鼠點選圖形視窗外的部分也可以結束。引數type的效果和在高階繪圖函式中使用時是一樣的,即在選擇的點繪製指定的圖形。預設情況是不繪製圖形。函式locator()將所選點的座標返回到一個列表中,列表包含x,y兩個元件。
通常locator()在呼叫的時候並不帶引數。這個功能在為圖例或標籤這樣的圖形元素選擇位置時比較有用,尤其是這些位置不好通過計算得到的時候。舉個例子,如果要在一個野點附近新增一些資訊,可以使用下面的命令
> text(locator(1), "Outlier", adj=0)


identify(x, y, labels)
允許使用者在x,y(使用滑鼠左鍵)定義的點附近繪製相應的labels的元件(如果沒有給出labels就給出該點的序號),突顯該點。當滑鼠的另一個鍵被點選時(Unix,Windows)返回被選點的序號,在Mac下通過點選圖形視窗外來實現這個效果。
有時我們更想確定圖形中的點,而非它們的位置。例如,我們可能希望從圖示中選出某些感興趣的觀測點,然後進行某些操作。通過兩個數值向量x,y給定一系列座標(x; y),我們可以使用identify()函式:
> plot(x,y) > identify(x,y)
函式identify()本身不繪圖,但是允許使用者移動滑鼠,在某點附近點選左鍵。離滑鼠指標最近的點將被突顯,並標出其序號(也就是它在向量x/y中的位置)。或者使用identify()的labels引數,把某些資訊(例如案例名稱)作為突顯的標誌;或者通過plot=FALSE引數取消所有突顯標誌。當選點的過程結束後,identify()返回所選點的序號;使用者可以使用這些序號從x和y中釋放所選的點。

12.4 使用圖形引數


通過圖形引數可以定製圖形顯示的幾乎所有方面。R包含大量的圖形引數,可以控制的包括線條型別,顏色,圖示排列,文字對齊等等。

1 持續性變更 (Permanent changes): par()函式


通過par()函式設定圖形引數的值會持續性的更改引數的值,也就是說這之後(在當前裝置上)所有對圖形函式的呼叫都受到新值的影響。
函式par()用於存取和修改當前圖形裝置的圖形引數列表。
par()不帶任何引數,返回當前裝置所有圖形引數和它們的值的列表。
par(c("col","lty"))
引數為一個字元向量,僅返回引數中指定的圖形引數(也是作為一個列表)。
par(col=4, lty=2)
帶指定引數(或一個列表型引數),設定指定圖形引數的值,並將引數的原始值作為一個列表返回。
所以如果想設定引數繪製一些圖形後再恢復成原來的設定,可以這麼做:
> oldpar <- par(col=4, lty=2)
. . . plotting commands . . .
> par(oldpar)

2 臨時性變更:圖形函式的引數


圖形引數也可以作為(幾乎)所有圖形函式的命名引數。這種方式的效果和用於par()函式的效果是一樣的,只不過這種改變只在函式呼叫的區間內有效。比如:
> plot(x, y, pch="+")
生成一個以加號作為繪圖符號的散點圖,而不改變後續圖形的預設的繪圖符號。

3 圖形引數列表

A  圖形元素
R圖表由點、線、文字和多邊形(填充區)組成。下面的圖形引數控制了圖形元素的繪製:
pch="+" 用來繪點的字元。這個預設值隨不同的圖形驅動是不同的,不過通常都是'±'。除非使用"."作為繪圖字元,否則繪製的點都會比適當的位置高一點或者低一點,而不是恰好在指定位置。
pch=4當給定一個0到18的整數時,會生成一個特殊的繪圖符號。通過下面的命令可以看這些符號都有什麼。
> legend(locator(1), as.character(0:18), pch=0:18)
lty=2 線條型別。並不是所有圖形裝置都支援多種線條型別(在那些支援的設
備上也不全一樣),不過線條型別1始終是實線,2及以上的是點、劃線或者它們的組合。
lwd=2 線條寬度。所需的線條寬度,是"標準"線條寬度的倍數。對line()等函式繪製的線條和座標軸都有效果。
col=2 點、線、文字、填充區和影象使用的顏色。每種圖形元素都有其可用的顏色列表,這個引數的值就是顏色在列表中的序號。顯然,這個引數值對有限的一類裝置有效。
font=2 指定文字所使用字型的一個整數。如果可能的話,裝置驅動會把1對應普通文字,2對應粗體,3對應斜體,4對應粗斜體。
font.axis   font.lab    font.main   font.sub 這幾個引數分別指定座標軸註釋,x,y軸的標籤,主、副標題所用的字型。
adj=-0.1 文字對齊和繪圖位置有關。0代表左對齊,1代表右對齊,0.5代表水平的中間位置。當前的值使會圖位置到左端距離的比例,所以-0.1在文字和繪圖位置之間留10%的空白。
cex=1.5 字元縮放。這個值是所需文字字元(包括繪圖字元)的大小,與預設文字大小相關。

B  座標軸和標記
很多R的高階圖形都有座標軸,你可以使用低階圖形函式axis()自己建立座標軸。座標軸包含三個主要元件:軸線axis line(線條型別由引數lty控制),標記tick mark(沿著軸線劃分單元),標號tick label(用來標出這些單元)。這些元件可以用下面這些引數定製。
lab=c(5,7,12)前兩個數字分別是x和y軸上所要劃分的區間數。第三個數字是座標軸標籤的長度,用字元數來衡量(包括小數點)。引數的值如果選得太小可能導致所有標號都聚在一起。
las=1 座標軸標籤的方向。0代表總是和座標軸平行,1代表總是水平的,2代表總是垂直於座標軸。
mgp=c(3,1,0)座標軸元件的位置。第一個元件是座標軸標籤到座標軸的距離,單位是文字行(text lines)。第二個元件是到標號的距離,最後一個是軸的巍直到軸線的距離(一般都是0)。正數代表繪圖區域外,負數代表區域內。
tck=0.01 標號的長度,繪圖區域大小的一個分數作單位。當tck比較小時(小於0.5),就強制x和y軸上的標記為相同大小。tck=1就是生成網格線。取負值時標記畫向繪圖區域外。內部標記可以使用tck=0.01和mgp=c(1,-1.5,0)。
xaxs="s"   yaxs="d" 分別是x、y軸的型別。如果是s(standard)或e(extended)型別,那最大和最小的標記都始終在資料區域之外。如果有某個點離邊界非常近,那麼擴充套件型(extended)的軸會稍稍擴充套件一下。這種型別的軸有時會在邊界附近留出大片空白。而i(internal)或r(預設值)型別的軸,標記始終在資料區域內,不過r型別會在邊界留出少量空白。
如果這個引數設為d,就鎖定當前軸,對之後繪製的所有圖形都用這個軸(直到引數被重新設定為其他的那幾個值)。這個引數適用於生成一系列固定尺度的圖。

C  圖邊緣(Figure margins)
在R中一個單獨圖形,圖(figure),包含一個繪圖區(plot region),以及環繞著這個區域的邊緣(其中可能含有座標軸標籤、標題等等),(通常)這兩部分以軸為邊界。
一個典型的圖是

控制圖的樣式的圖形引數包括:
mai=c(1,0.5,0.5,0)分別是底部,左側,頂部,右側的寬度,單位是英寸。
mar=c(4,2,2,1)與mai相似,只是單位是文字行(text lines)。
由於更改一個就會改變另一個的值,所以在這個意義上,mai和mar是等價的。這個引數的預設值通常都太大了;右側邊緣很少用到,如果沒標題,頂部邊緣也不需要,左側和底部的邊緣應當足夠大,以容納座標軸和標號。此外,預設值並沒有考慮到裝置表面的大小:比如,使用postscript()驅動,height=4引數時,除非用mar,mai另外設定,否則圖的邊緣就要佔上大約50%。使用多圖環境時(後面會提到)。邊緣會減少一半,不過這在多圖共用一頁的時候可能還不夠。

D 多圖環境
R允許在一頁上建立一個n?m的圖的陣列。每個圖由自己的邊緣,圖的陣列還有一個可選的外部邊緣,如下圖所示。

與多圖環境相關的圖形引數有:
mfcol=c(3, 2)    mfrow=c(2, 4)
   設定多圖陣列的大小。第一個值是行數,第二個值是列數。這兩個引數唯一的區別是mfcol把圖按列排入,mfrow把圖按行排入。上圖所示的版式可用mfrow=c(3,2)建立;上圖顯示的是繪製四幅圖後的情況。
mfg=c(2, 2, 3, 2)
    當前圖在多圖環境下的位置。前兩個數字是當前圖的行、列數;後兩個是其在多圖陣列中的行列數。這個引數用來在多圖陣列中跳轉。你甚至可以在後兩個數中使用和真值(true value)不同的值,在同一頁上得到大小不同的圖。
fig=c(4, 9, 1, 4)/10
    當前圖在頁面的位置,取值分別是左下角到左邊界,右邊界,下、上邊界的距離與對應邊的百分比數。給出的例子是一個頁面右下角的圖。這個引數可以設定圖在頁面的絕對位置。
oma=c(2, 0, 3, 0)   omi=(0, 0, 0.8, 0) 
       外部邊緣的大小。與mar和mai相似,第一個用文字行作單位,第二個以英寸作單位,從下方開始按照順時針順序指定。
外部邊緣對頁標題這類東西很有用。文字可以通過帶outer=TRUE引數的mtext()函式加入外部邊緣。預設情況下是沒有外部邊緣的因此必須通過oma或omi指定。
函式split.screen()和layout()可以對多個圖形作更復雜的排列。

12.6 裝置驅動


R幾乎可以在任何一種型別的顯示器和列印裝置上生成(不同質量的)圖形。不過,在這之前,需要告訴R要處理的是哪一種裝置。這通過啟動一個裝置驅動來完成。
裝置驅動通過呼叫裝置驅動函式來啟動。
某些常用的裝置驅動有:
X11()[Unix] 使用X11視窗系統
windows()[Windows]   使用 Windows 視窗系統
postscript()在PostScript印表機上列印或者建立PostScript圖形檔案
pictex()生成一個LATEX檔案
當一個裝置使用完之後,可以通過下面的命令終止裝置驅動
> dev.off()
這個命令可以確保裝置已經結束;例如,在某些硬拷貝的裝置中,這個命令可以保證每頁都已經完成,並且都被傳送到印表機了。

PostScript文件
通過給postscript()函式帶上file引數,我們可以把圖形以PostScript格式儲存到檔案中。如果沒有給出horizontal=FALSE引數,圖形是橫向的,你可以通過width和height引數控制圖形的大小(圖形會自動適應)。例如,命令
> postscript("file.ps", horizontal=FALSE, height=5, pointsize=10)
為一個五英寸的圖生成一個包含PostScript程式碼的檔案,可以放在文當中。如果命令中的指定的檔名已經存在,將會被覆蓋。

多重圖形裝置
每個對裝置驅動的新呼叫都會開啟一個新的圖形裝置,在裝置列表中加入新的一項。這個裝置就成為當前裝置,圖形輸出就傳送到這個裝置。
dev.list()      返回所有活動中裝置的序號和名稱。在列表位置1的裝置始終是空裝置(null device),這個裝置不接收任何圖形命令。
dev.next()    dev.prev()     分別返回當前裝置的後一個和前一個裝置的序號和名稱。
dev.set(which=k)     用來把當前裝置更改為裝置列表中位置k的那個。返回裝置的序號和標籤。
dev.off(k)    終止圖形列表位置k的那個圖形裝置。對於某些裝置,比如postscript,這個命令會立刻列印檔案或者正常結束檔案,具體怎樣處理取決於裝置是怎樣初始化的。
dev.copy(device,. . . ,which=k)      dev.print(device,. . . ,which=k)
建立一個裝置k的拷貝。其中device是一個裝置函式,例如postscript,如果需要的話可以在'. . . '中指定其它的引數,dev.print效果相似,不過複製的裝置會立刻關閉,所以列印硬拷貝這樣的終止操作也會被立即執行。