R語言入門

前言:關於R

在R的官方教程裏是這麼給R下註解的:一個數據分析和圖形顯示的程序設計環境(A system for data analysis and visualization which is built based on S language.)。

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())。
pmaxpmin將返回一個與最長的向量長度相等的向量,向量中的元素由參數中所有向量在相應位置的最大值(最小值)組成;
如果要使用複數,需要直接給出一個複數部分。因此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 邏輯向量

TRUEFALSE, 和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$nameLst[["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 檢測數據集的分佈

函數summaryfivenum這兩個函數可以給出摘要,後者只給出數值;
函數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效果相似,不過複製的設備會立刻關閉,所以打印硬拷貝這樣的終止操作也會被立即執行。
graphics.off()      終止列表中的所有圖形設備,空設備除外。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章