




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Next:Notes,Previous:(dir),Up:(dir)
R語(yǔ)言定義
本冊(cè)主要對(duì)R語(yǔ)言,賦值解釋(explainingevaluation),解析,面向?qū)ο缶?/p>
程,語(yǔ)言上的計(jì)算等方面進(jìn)行一個(gè)介紹。
本文檔的當(dāng)前版本為0.010草稿。該文檔譯自R-2.3.1文檔(2006年6月1
日)。
丁國(guó)徽(ghding@)譯。
本文檔的一些發(fā)布信息放置在http://www.biosino.Org/R/R-doc/。
ISBN3-900051-13-5
?Notes:說(shuō)明
?Introduction:緒論
?Objects:對(duì)象
?Evaluationofexpressions:表達(dá)式求值
?Functions:函數(shù)
?Object-orientedprogramming:面向?qū)ο缶幊?/p>
?Computingonthelanguage:語(yǔ)言上的計(jì)算
?Systemandforeignlanguageinterfaces:系統(tǒng)和其它語(yǔ)言的接口
?Exceptionhandling:異常處理
?Debugging:調(diào)試
?Parser:解析器
?FunctionandVariableIndex:函數(shù)和變量索引
?ConceptIndex:概念索引
?References:參考文獻(xiàn)
1緒論
R是為統(tǒng)計(jì)計(jì)算和圖形展示而設(shè)計(jì)的一個(gè)系統(tǒng)。它包括一種編程語(yǔ)言,高級(jí)別
圖形展示函數(shù),和其它語(yǔ)言的接口以及調(diào)試工具。本手冊(cè)將會(huì)詳細(xì)描述和定義R
語(yǔ)言。
R是統(tǒng)計(jì)領(lǐng)域廣泛使用的誕生于1980年左右的S語(yǔ)言的一個(gè)分支。S的主
要設(shè)計(jì)者JohnM.Chambers因?yàn)镾語(yǔ)言方面的工作獲得了1998年ACM軟
件系統(tǒng)獎(jiǎng)(
ACMSoftwareSystemsAward)o
該語(yǔ)言的語(yǔ)法表面上類似C,但在語(yǔ)義上是函數(shù)設(shè)計(jì)語(yǔ)言的(functional
programminglanguage)的變種并且和Lisp以及APL有很強(qiáng)的兼容性。特
別的是,它允許在"語(yǔ)言上計(jì)算"(這使得
computingonthelanguage)o
它可以把表達(dá)式作為函數(shù)的輸入?yún)?shù),而這種做法對(duì)統(tǒng)計(jì)模擬和繪圖非常有用。
通過(guò)命令行運(yùn)行簡(jiǎn)單的表達(dá)式可以充分地交互使用R的功能。一些用戶可能
這樣做就能滿足要求了,但還有一些用戶想編寫他們自己的函數(shù)編寫函數(shù)的用
戶要么用以一種特別的方式,系統(tǒng)化一些常常重復(fù)的工作或者為新的功能編寫擴(kuò)
展包。
本手冊(cè)的目的是想記錄R語(yǔ)言的本施也就是它所工作的對(duì)象,表達(dá)式賦值過(guò)
程的細(xì)節(jié)。這些內(nèi)容的了解對(duì)編寫R函數(shù)非常有用。另外一些針對(duì)特定任務(wù)的
主題,如繪圖,在本冊(cè)里面只是簡(jiǎn)單描述,而在其它手冊(cè)里面有專門的論述。
盡管手冊(cè)中的大部分內(nèi)容同樣適用于S,但S和R還是有一些實(shí)質(zhì)上的差異。為
了不至于混淆,我們集中描述R。
R語(yǔ)言的設(shè)計(jì)包含了一系列亮點(diǎn),當(dāng)然也有讓用戶驚訝的公共缺陷。許多設(shè)計(jì)
是基于底層的連貫性考慮,我們會(huì)在后面的行文中解稱它還包括很多有用的快
捷方式和特殊用法,使得用戶可以很簡(jiǎn)潔的表述復(fù)雜的操作。一旦用戶熟悉底層
的概念,這些用法將會(huì)變得非常的自然在某些情況下,有多種方法完成同一件
事情,但是其中有些技術(shù)依賴于語(yǔ)言的實(shí)現(xiàn),另外一些技術(shù)則是一個(gè)更高層次上
的抽象。在這種情況下,我們會(huì)指出首選的用法。
讀本冊(cè)前,我們假定用戶對(duì)R已經(jīng)有一定的了解。這不是一本R的入門讀物,
而是一本程序員的參考手冊(cè)。其它文檔給出了互補(bǔ)的信息:特別Preface(R
Introduction)給出R語(yǔ)言的入門介紹和Systemandforeignlanguage
interfaces(WritingRExtensions)詳細(xì)介紹如何用編譯好的代碼擴(kuò)充R語(yǔ)言
2對(duì)象
在所有編程語(yǔ)言中,變量提供了一種訪問(wèn)內(nèi)存中數(shù)據(jù)的方法。R沒(méi)有提供直
接訪問(wèn)計(jì)算機(jī)內(nèi)存的方法,但提供了許多我們稱之為對(duì)象的特殊數(shù)據(jù)結(jié)構(gòu)。這
些對(duì)象通過(guò)變量或者符號(hào)(symbol)訪問(wèn)。不過(guò)在R語(yǔ)言里面,符號(hào)本身就
是對(duì)象并且和使用其它對(duì)象一樣的方式使用。這和許多其它語(yǔ)言不同,但有廣泛
的影響。
在本章,我們會(huì)給出R里面各種數(shù)據(jù)結(jié)構(gòu)的初步描述。對(duì)這些數(shù)據(jù)結(jié)構(gòu)更為詳
細(xì)的討論會(huì)在后面的章節(jié)中展開(kāi)。R語(yǔ)言特有的函數(shù)typeof返回R對(duì)象的類
戮注意在R底層的C代碼中,所有對(duì)象都是指向一個(gè)有類型定義SEXPREC
的結(jié)構(gòu)體(structure)的指針;不同的R數(shù)據(jù)類型在C里面用決定結(jié)構(gòu)體各部
分信息的SEXPTYPE表示。
下面的表格描述了typeof可能的返回值以及它們的涵義。
NULL空
symbol一個(gè)變量名字
pairlist成對(duì)列表對(duì)象
closure一個(gè)函數(shù)
environment一個(gè)環(huán)境
promise一個(gè)用于實(shí)現(xiàn)悠閑賦值的對(duì)象
language一個(gè)R語(yǔ)言構(gòu)建
special一個(gè)不可針對(duì)參數(shù)求值的內(nèi)置函數(shù)
builtin一個(gè)可針對(duì)參數(shù)求值的內(nèi)置函數(shù)
logical含邏輯值的向量
integer含整數(shù)值的向量
double含實(shí)數(shù)值的向量
complex含復(fù)數(shù)值的向量
character含字符值的向量
特定變量長(zhǎng)度參數(shù)***
any一個(gè)可以匹配任何類型的特殊類型***
expression一個(gè)表達(dá)式對(duì)象
list一個(gè)列表
externalptr一個(gè)外表指針對(duì)象
weakref——個(gè)弱弓1用又寸象(aweakreferenceobject)
raw一個(gè)字節(jié)元素向量
我認(rèn)為用戶不用深入以'***'標(biāo)記的條目,至少?zèng)]有想象的那么容易;但是可以多
看一些例子。
根據(jù)Becker,Chambers&Wilks(1988)中的說(shuō)明,函數(shù)mode返回對(duì)象的
?;蜓韵ⅲ⑶液推渌黃語(yǔ)言的變種完全兼容。最后,同樣基于Beckeretal.
的考慮,函數(shù)返回其參數(shù)的存皤維
(1988)storage.mode4storagemode)o
該函數(shù)常常用于,在外部語(yǔ)言(如C或FORTRAN)中調(diào)用函數(shù)時(shí)確保R對(duì)象
有被調(diào)用的程序所期望的數(shù)據(jù)對(duì)象(在S語(yǔ)言里面,整數(shù)值或?qū)崝?shù)值向量都是
"numeric"模式,因此它們的存儲(chǔ)模式需要區(qū)分。)
>x<-1:3
>typeof(x)
[1]"integer"
>mode(x)
[1]"numeric"
>storage.mode(x)
[1]"integer"
R在計(jì)算過(guò)程中,對(duì)象常常需要強(qiáng)制轉(zhuǎn)換成不同的類型(type)。有許多函數(shù)
可用于顯式的強(qiáng)制轉(zhuǎn)換。在僅僅用R語(yǔ)言編程的時(shí)候,一個(gè)對(duì)象的類型通常
不會(huì)影響計(jì)算結(jié)果,但是當(dāng)混合使用外部編程語(yǔ)言或不同的操作系統(tǒng)時(shí),常常需
要保證對(duì)象類型的正確。
?Basictypes:基本類型
?Attributes:屬性
?Specialcompoundobjects:特殊的混合對(duì)象
2.1基本類型
?Vectorobjects:向量對(duì)象
?Listobjects:列表對(duì)象
?Languageobjects:語(yǔ)言對(duì)象
?Expressionobjects:表達(dá)式對(duì)象
?Functionobjects:函數(shù)對(duì)象
?NULLobject:空對(duì)象
?Built-inobjectsandspecialforms:內(nèi)置對(duì)象和特別形態(tài)
?Promiseobjects:允諾對(duì)象
?Dot-dot-dot:…對(duì)象
?Environmentobjects:環(huán)境對(duì)象
?Pairiistobjects:成對(duì)列表對(duì)象
?Any-type:任意類型
2.1.1向量
向量可以看著是由一系列包含數(shù)據(jù)的緊密聯(lián)結(jié)的單元格子構(gòu)成這些單元格通過(guò)
類似x[5]的索引操作來(lái)訪問(wèn)。更細(xì)節(jié)的內(nèi)容可以參考Indexing。
R有六個(gè)基本('原子性’)向量類型:邏輯型,整數(shù)型,實(shí)數(shù)型,復(fù)數(shù)型,字符
串(字符)型和原味型(raw)。這些不同向量類型的模式和存儲(chǔ)模式如下表所
ZJXo
typeofmodestorage.mode
logicallogicallogical
integernumericinteger
doublenumericdouble
complexcomplexcomplex
charactercharactercharacter
rawrawraw
單個(gè)的數(shù)字,如4.2,以及字符串,如"fourpointtw。",仍然是長(zhǎng)度為1的向
量,因?yàn)闆](méi)有更基本的數(shù)據(jù)類型了。零長(zhǎng)度向量是允許的(也是非常有用的)。
字符串向量的模式和存儲(chǔ)模式都是"character';字符向量的單個(gè)元素常常是字
符串。
2.1.2列表
列表(“廣義向量’)是另外一種數(shù)據(jù)存儲(chǔ)方式。列表含有元素,每一個(gè)元素可
以是任意R對(duì)象類型,也就是說(shuō),列表的各個(gè)元素可以是不同的數(shù)據(jù)類型。列
表元素的訪問(wèn)可以通過(guò)三個(gè)不同索引操作實(shí)現(xiàn)。這些在Indexing部分將會(huì)詳
細(xì)介紹。
列表是向量,并且在不能使用列表時(shí),基本的向量類型可以轉(zhuǎn)換為糜子庖量,
2.1.3語(yǔ)言對(duì)象
三種對(duì)象類型構(gòu)成了R語(yǔ)言的全部。它26K是調(diào)用類型(calls),表達(dá)式類
型(expressions)和\命名類型(names)。既然R有"expression"類型
的對(duì)象,所以我們應(yīng)該盡量避免在其它地方使用“表達(dá)式”這個(gè)詞。需要注意的
是,語(yǔ)法上正確的表達(dá)式會(huì)被看作是相的吾切(statements人這些對(duì)象分別
有"call","expression",和"name"三種模式。
這些對(duì)象可以利用quote機(jī)制從表達(dá)式直接創(chuàng)建,并且可以通過(guò)函數(shù)as.list
和as.call與列表相互轉(zhuǎn)換。解析樹(shù)的分量可以通過(guò)標(biāo)準(zhǔn)的索引操作析取。
?Symbolobjects:符號(hào)對(duì)象
2.1.4表達(dá)式對(duì)象
在R里面,我們可以創(chuàng)建類型為"expression"的對(duì)象。一個(gè)表達(dá)式
(expression)含有一個(gè)或多個(gè)程序語(yǔ)句。其中,程序語(yǔ)句(statement)指的
是語(yǔ)法上正確的一群標(biāo)記的聚集。表達(dá)式對(duì)象是一種特殊語(yǔ)言對(duì)象,它包含一
些解析過(guò)但還未求值的R語(yǔ)句。相比其它語(yǔ)言對(duì)象,它的主要差別在于一個(gè)表
達(dá)式對(duì)象可以包含多個(gè)同類型的表達(dá)式。另外一個(gè)更細(xì)微的差別是,
"expression"類型的對(duì)象僅僅當(dāng)它顯式地傳遞給函數(shù)eval時(shí)才求值,而其它語(yǔ)
言對(duì)象可在一些意想不到的情況下求值。
表達(dá)式對(duì)象的操作行為非常像列表,它的元素訪問(wèn)方式和列表元素的訪問(wèn)方式一
樣。
2.1.5函數(shù)對(duì)象
在R里面,函數(shù)是對(duì)象并且可以有許多和其它對(duì)象類似的操作方法。函數(shù)(更
準(zhǔn)確地說(shuō)是函數(shù)閉包(functionclosure))有三個(gè)基本的組成部分:形式化的
參數(shù)列表,功能實(shí)現(xiàn)的主體和環(huán)境參數(shù)列表是一個(gè)以逗號(hào)分割的參數(shù)的列表。
參數(shù)可以是符號(hào),或者是symboldefault的形式,或者是特殊參數(shù).第
二種參數(shù)形式常常用于設(shè)置參數(shù)的默認(rèn)值如果函數(shù)調(diào)用時(shí)參數(shù)缺省,該值會(huì)被
采用。...參數(shù)比較特殊,而且可以包含任意多的參數(shù)。它通常在參數(shù)個(gè)數(shù)未知
或者某些參數(shù)會(huì)傳遞給其它函數(shù)的情況下使用。
功能實(shí)現(xiàn)的主體是解析過(guò)的R語(yǔ)句。它常常是大括弧里面的一系列程序語(yǔ)句。
當(dāng)然,它也有可能是一個(gè)單獨(dú)的語(yǔ)句,一個(gè)符號(hào),甚至是一個(gè)常量。
函數(shù)的環(huán)境指的是當(dāng)一個(gè)函數(shù)被創(chuàng)建時(shí)所激活的環(huán)境。任何被該環(huán)境綁定的符
號(hào)都可以被函數(shù)詞的和訪問(wèn)函數(shù)代碼及其對(duì)應(yīng)環(huán)境中綁定的東西構(gòu)成的組合體
稱為'函數(shù)閉包'(該術(shù)語(yǔ)源自函數(shù)化編程理論(
functionclosure)ofunctional
programmingtheory)。在本文檔中,我們主要使用術(shù)語(yǔ)'函數(shù)',但使用'閉包
,(closure)來(lái)強(qiáng)調(diào)一個(gè)函數(shù)相關(guān)環(huán)境的重要性。
可以通過(guò)formals,body,和environment三個(gè)構(gòu)造(這三個(gè)構(gòu)造也可用
在賦值語(yǔ)句的左邊)來(lái)析取和操作閉包的三個(gè)部分。最后一個(gè)構(gòu)造可以用來(lái)去
掉不想要的環(huán)境捕獲物(
environmentcapture)o
當(dāng)一個(gè)函數(shù)被調(diào)用時(shí),一個(gè)新的環(huán)境(林為求值環(huán)境(evaluation
environment))將會(huì)被創(chuàng)建。該環(huán)境的外圍(enclosure,見(jiàn)Environment
他國(guó)§)來(lái)自函數(shù)閉包的環(huán)境。這個(gè)新的環(huán)境最初由函數(shù)的未被求值的參數(shù)構(gòu)
成;當(dāng)求值過(guò)程進(jìn)行時(shí),局部變量將會(huì)在該環(huán)境中創(chuàng)建。
可以方便地用as.list和as.function將函數(shù)和列表結(jié)構(gòu)相互轉(zhuǎn)換這些方法可
以用來(lái)實(shí)現(xiàn)和S兼容,但我們不推崇這樣使用。
2.1.6空對(duì)象
NULL是一種非常特殊的對(duì)象它用于表明一個(gè)對(duì)象不存在,注意不能混淆空對(duì)
象與零長(zhǎng)度的向量/列表。NULL對(duì)象沒(méi)有類型也沒(méi)有可以更改的特性。在R
里面,只用NULL對(duì)象允許被所有的實(shí)例對(duì)象引用(唯一的一個(gè))。為了檢測(cè)
一個(gè)對(duì)象是否是NULL,可以使用代碼is.null。你不可以設(shè)置NULL的屬性。
2.1.7內(nèi)置對(duì)象和特別形態(tài)
有兩種類型的對(duì)象含有R的內(nèi)置函數(shù),就是代碼列表中顯示為.Primitive的部
分。這兩種對(duì)象的差異在于參數(shù)的處理方武內(nèi)置函數(shù)將對(duì)它們所有參數(shù)求值并
且傳給原始的函數(shù),即值調(diào)用(call-by-value)。而一些特別函數(shù)把沒(méi)有求值
的表達(dá)式傳給內(nèi)部函數(shù)。
從R語(yǔ)言的角度來(lái)說(shuō),這些對(duì)象僅僅是另外一種函數(shù),只是它們的定義不能列
出而已函數(shù)typeof可以把它們與解釋型函數(shù)(interpretedfunction)區(qū)分
開(kāi)。
2.1.8允諾對(duì)象
允諾對(duì)象(promiseobjects)是R的悠閑(lazy)求值機(jī)制的一部分。它們
含有三個(gè)槽(slots):值,表達(dá)式和環(huán)境。當(dāng)一個(gè)函數(shù)被調(diào)用,首先參數(shù)匹
配,然后每個(gè)形式參數(shù)都會(huì)被一個(gè)允諾約束,用作形似參數(shù)的表達(dá)式以及函數(shù)調(diào)
用的環(huán)境的指針都保存在允諾里面。
直到該參數(shù)被訪問(wèn),才會(huì)有簸聯(lián)允諾。當(dāng)參數(shù)被訪問(wèn)時(shí),保存的表達(dá)式會(huì)在保
存的環(huán)境中求值,并返回結(jié)果。結(jié)果同樣被允諾保存。函數(shù)substitute會(huì)提
取一個(gè)表達(dá)式槽里面的內(nèi)容這使得程序員既可以訪問(wèn)允諾相關(guān)的值也可以訪問(wèn)
相關(guān)的表達(dá)式。
在R語(yǔ)言里面,允諾對(duì)象常常是隱含的對(duì)象。(在以后的R發(fā)布版本中,它們
相對(duì)R代碼是透明的,因?yàn)樗鼈兛偸窃诒辉L問(wèn)的時(shí)候求值。)實(shí)際的函數(shù)參數(shù)
是這種類型的。函數(shù)delayedAssign可以使一個(gè)允諾出現(xiàn)在表達(dá)式的外面。通
常還沒(méi)有辦法在R代碼里面檢驗(yàn)一個(gè)對(duì)象是否是允諾,同時(shí)也沒(méi)有方法用R
代碼確定一個(gè)允諾的環(huán)境。
2.1.9…對(duì)象
...對(duì)象類型以列表形式保存?!姆至吭贑代碼里面可以像常規(guī)的列表一樣
訪問(wèn),但在解釋型的代碼里面不像一個(gè)對(duì)象那樣容易訪問(wèn)。該對(duì)象可以捕獲作為
一個(gè)列表,因此在函數(shù)table的實(shí)現(xiàn)代碼中,我們可以看到下面的例子
args<-list(...)
##....
for(ainargs){
##....
如果一個(gè)函數(shù)以…作為形式參數(shù),那么任何不匹配形式參數(shù)的實(shí)際參數(shù)都將匹
酉己…。
2.1.10環(huán)境
環(huán)境可以簡(jiǎn)單地看作由兩部分組成。一個(gè)是包含“符號(hào)-值"對(duì)集合的煤
(frame),另一個(gè)是指向外圍環(huán)境的指針(又稱為(外圍))(enclosure)。
當(dāng)R搜索一個(gè)符號(hào)的值時(shí),框架將會(huì)被檢查。如果找到了一個(gè)匹配的符號(hào),它
的值將會(huì)被返回。如果找不到,外圍環(huán)境將會(huì)被訪問(wèn)并且重復(fù)這個(gè)過(guò)程。環(huán)境形
成一個(gè)樹(shù)形結(jié)構(gòu),而外圍起到一個(gè)父節(jié)點(diǎn)的角色環(huán)境的樹(shù)結(jié)構(gòu)的根部是一個(gè)空
的環(huán)境,可以通過(guò)沒(méi)有父節(jié)點(diǎn)的emptyenv()訪問(wèn)。它是基本包環(huán)境的直接父
節(jié)點(diǎn)(可以通過(guò)函數(shù)baseenv()訪問(wèn))。以前,baseenv()可以是NULL,但
從版本2.3.0開(kāi)始,不贊成用NULL作為環(huán)境。
環(huán)境通過(guò)函數(shù)調(diào)用隱式創(chuàng)建,這些內(nèi)容在Functionobjects和Lexical
environment部分將會(huì)描述。在這種情況下,環(huán)境含有函數(shù)的局部變量(包括
參數(shù)),而它的外圍是當(dāng)前調(diào)用函數(shù)的環(huán)境。環(huán)境還可以直接通過(guò)new.env創(chuàng)
建。一個(gè)環(huán)境的框架內(nèi)容可以通過(guò)Is,get,assign以及eval和evalq訪
問(wèn)和操作。
函數(shù)parent.env可以用于訪問(wèn)一個(gè)環(huán)境的外圍。
和其它的R對(duì)象不一樣,環(huán)境不是通過(guò)拷貝一份新的傳遞給函數(shù)或者用于賦值
操作中。因此,如果你將一個(gè)的環(huán)境賦給好幾個(gè)符號(hào)并且改變其中的一個(gè),那么
其它的也都會(huì)改變特別是,把一個(gè)屬性賦給一個(gè)環(huán)境會(huì)導(dǎo)致一些非常奇異的事
情。
2.1.11成對(duì)列表對(duì)象
成對(duì)列表對(duì)象和Lisp的點(diǎn)-對(duì)列表(dotted-pairlist)類似。它們廣泛用于R
的內(nèi)部。但很少見(jiàn)于解釋型的代碼里面,盡管它們被formals返回或通過(guò)函數(shù)
pairlist創(chuàng)建。一個(gè)零長(zhǎng)度的成對(duì)列表是NULL,這和Lisp期望的一樣但與零
長(zhǎng)度列表不一樣。每個(gè)這樣的對(duì)象有三個(gè)槽變量,CAR值,CDR值和TAG值。
TAG值是文本字符串,CAR和CDR分別表示一個(gè)以空對(duì)象作為終結(jié)符的列表
的列表項(xiàng)目(頭)和剩余項(xiàng)目(尾)(CAR/CDR術(shù)語(yǔ)是傳統(tǒng)Lisp術(shù)語(yǔ),最初
用于60年代IBM電腦的寄存器)。
R語(yǔ)言里面成對(duì)列表的操作和廣義向量("列表")完全一樣。特別的是,元素也
是通過(guò)[口]方式訪問(wèn)。由于廣義向量可以更為高效地應(yīng)用,一般不贊同使用成
對(duì)列表。如果通過(guò)R訪問(wèn)一個(gè)內(nèi)部的成對(duì)列表,我們常常把它轉(zhuǎn)換成廣義向量
(包括取子集的操作)。
在很少情況下,用戶可以看到成對(duì)列表:其中一個(gè)例子是.Options。
2.1.12"任意”類型
事實(shí)上,不可能有一個(gè)對(duì)象是"任意"(any)類型的,但它仍然是一個(gè)合法的
類型值。它用于一些特定環(huán)境中(非常非常地少),如as.vector(x,"any")表明
沒(méi)有必要采用類型的強(qiáng)制轉(zhuǎn)換。
2.2屬性
除了NULL,所有對(duì)象有一個(gè)或多個(gè)相關(guān)屬性。屬性以列表形式保存,其中所有
元素都有名字,屬性列表可以通過(guò)attributes得到或通過(guò)attributes<-設(shè)定,
單個(gè)的屬性分量可以通過(guò)attr和attr<-訪問(wèn)。
一些屬性有特別的訪問(wèn)函數(shù)(如和因子相關(guān)的levels<-),但這些只在可用的
情況下才能使用。為了隱藏實(shí)現(xiàn)細(xì)節(jié),它們可以進(jìn)行一些額外的操作。R嘗試
攔截對(duì)含有特別屬性的attr<-和attributes<-的調(diào)用,以強(qiáng)迫進(jìn)行一致性的
檢驗(yàn)。
矩陣和數(shù)組是含有屬性dim及可選屬性dimnames的簡(jiǎn)單向量。
屬性用于實(shí)現(xiàn)R里面的類結(jié)構(gòu)。如果一個(gè)對(duì)象有一個(gè)class屬性,那么該屬性
將會(huì)在求值過(guò)程中被檢驗(yàn)。R的類結(jié)構(gòu)會(huì)在Object-orientedprogramming
部分仔細(xì)描述。
?Names:名字
?Dimensions:維度
?Dimnames:維度名字
?Classes:類
?Timeseriesattributes:時(shí)間序列屬性
2.2.1名字
如果存在names屬性,names屬性會(huì)為一個(gè)向量或列表中的每個(gè)元素加上標(biāo)
簽。當(dāng)對(duì)象被打印時(shí),names屬性同樣用于為元素加上標(biāo)簽(在存在names
屬性的情況下)。屬性還可以用作索引,例如
namesquantile(x)["25%"]o
可以通過(guò)names和names<-構(gòu)造取得和設(shè)置名字,后者將會(huì)執(zhí)行必要的一
致性檢驗(yàn)以保證名字屬性有適合的類型和長(zhǎng)度。
成對(duì)列表和一維數(shù)組的處理比較特殊。對(duì)于成對(duì)列表對(duì)象,一個(gè)虛擬的names
屬性將被使用;names屬性實(shí)際上通過(guò)列表分量的標(biāo)簽構(gòu)建。對(duì)于一維數(shù)組,
屬性事實(shí)上是訪問(wèn)
namesdimnames[[l]]0
2.2.2維度
dim屬性用于實(shí)現(xiàn)數(shù)組。數(shù)組的內(nèi)容保存在一個(gè)列優(yōu)先排列(column-major
order)的向量中而dim屬性是一個(gè)指定數(shù)組各維度長(zhǎng)度的整數(shù)向量R保證
了向量的長(zhǎng)度是各維度長(zhǎng)度的乘積。一個(gè)或多個(gè)維度的長(zhǎng)度可以為0。
向量和一維數(shù)組不一樣,因?yàn)楹笳哂虚L(zhǎng)度為1的dim屬性,而前者沒(méi)有dim屬
性。
2.2.3維度名字
數(shù)組會(huì)利用由字符向量構(gòu)成的dimnames屬性給各個(gè)維度命名。dimnames
列表自身也可能有名字,在打印數(shù)組的時(shí)候這個(gè)名字可用作維度名字(extent
headings)。
2.2.4類
R有一個(gè)精心設(shè)計(jì)的類系統(tǒng)。它通過(guò)class屬性控制。該屬性是一個(gè)含有類列
表的字符向量,這些類可以被對(duì)象繼承。這構(gòu)成了R里面“泛型方法"
(genericmethods)功能性的基礎(chǔ)。
該屬性可以沒(méi)有限制的被用戶虛擬訪問(wèn)和操作,對(duì)于一個(gè)對(duì)象是否真的含有類方
法期望的組成要素是不會(huì)被檢驗(yàn)的。因此,改變class屬性需要小心一點(diǎn)。當(dāng)
實(shí)在需要的時(shí)候,建議使用一些特別的創(chuàng)建和強(qiáng)制轉(zhuǎn)換函數(shù)。
2.2.5時(shí)間序列屬性
tsp屬性用來(lái)保存時(shí)間序列的參數(shù),起點(diǎn),終點(diǎn)和頻率。該構(gòu)造主要用于處理有
周期性背景的序列數(shù)據(jù)(如月或季度數(shù)據(jù))。
2.3特殊的復(fù)合對(duì)象
?Factors:因子
?Dataframeobjects:數(shù)據(jù)框?qū)ο?/p>
2.3.1因子
因子可用于描述含有數(shù)目有限值(性別,社會(huì)階層等)的條目。因子有一個(gè)levels
屬性和"factor"類另外,它還可以擁有一個(gè)可選的contrasts屬性contrasts
屬性用于控制模型構(gòu)建函數(shù)中的參數(shù)設(shè)置。因子可能是完全無(wú)序的或者有序的
分類。在后面的例子中,可以根據(jù)因子的不同類型定義并且有一個(gè)對(duì)應(yīng)的class
向量c("ordered","factor"),,
現(xiàn)在,因子通過(guò)指定實(shí)際水平的整型數(shù)組和一個(gè)映射整數(shù)到名字的字符數(shù)組來(lái)實(shí)
現(xiàn)。不幸得是,用戶常常利用這種實(shí)現(xiàn)方式讓一些計(jì)算變得比較簡(jiǎn)單。但是,這
只是一個(gè)實(shí)現(xiàn)的問(wèn)題,而不能保證R的所有實(shí)現(xiàn)中都可以這樣。
2.3.2數(shù)據(jù)框?qū)ο?/p>
數(shù)據(jù)框是R里面模仿SAS或SPSS數(shù)據(jù)集最像的數(shù)據(jù)結(jié)構(gòu),即數(shù)據(jù)的"個(gè)體-
變量"(casesbyvariables)矩陣。
數(shù)據(jù)框是由長(zhǎng)度一樣(如果是矩陣則是行數(shù)一致)的向量,因子和/或矩陣構(gòu)成
的列表。此外,數(shù)據(jù)框通常有一個(gè)names屬性來(lái)標(biāo)記變量和s屬
性來(lái)標(biāo)記個(gè)體。
數(shù)據(jù)框可以包含一個(gè)同其它分量長(zhǎng)度一致的列表該列表可以包含不同長(zhǎng)度的元
素,這樣就提供了一種參差數(shù)組(raggedarrays)的數(shù)據(jù)結(jié)構(gòu)。但是在寫本文
檔的時(shí)候,這種數(shù)組通常還不能正確處理。
3表達(dá)式的求值
當(dāng)用戶在命令行上鍵入一行命令(或者從文件中讀入一個(gè)表達(dá)式),首先該命令
將會(huì)被解析成一個(gè)內(nèi)在的表述方式。求值程序執(zhí)行解析后的R表達(dá)式并且返
回表達(dá)式的值。所有表達(dá)式都有一個(gè)值。這就是R語(yǔ)言的核心。
本章描述求值程序的基本機(jī)制,但不討論特定函數(shù)或者后面獨(dú)立章節(jié)將討論的函
數(shù)組或者幫助文檔已經(jīng)提供足夠信息內(nèi)容。
用戶可以自己構(gòu)建表達(dá)式并對(duì)它們調(diào)用求值程序。
?Simpleevaluation:簡(jiǎn)單求值
?Controlstructures:控制結(jié)構(gòu)
?Elementaryarithmeticoperations:初等算術(shù)操作
?Indexing:索弓|
?Scopeofvariables:變量作用域
3.1簡(jiǎn)單求值
?Constants:常量
?Symbollookup:符號(hào)查找
?Functioncall。函數(shù)調(diào)用
?OperaOrs:操作符
3.1.1常量
任何直接在提示符下面鍵入的數(shù)字都是常量,且被求值。
>1
[1]1
常量比較地單調(diào)。如果要做更多的事情,我們需要符號(hào)。
3.1.2符號(hào)直找
當(dāng)一個(gè)新的變量創(chuàng)建時(shí),它需要一個(gè)可以被引用的名字。通常,它還需要一個(gè)值.
名字本身就是符號(hào)。當(dāng)一個(gè)符號(hào)被求值時(shí),它的值就會(huì)被返回。后面我們將
會(huì)仔細(xì)解釋怎樣決定一個(gè)和符號(hào)相關(guān)的值。
在下面簡(jiǎn)單的例子中,y是一個(gè)符號(hào)并且它的值是4。符號(hào)也是R對(duì)象,但是我
們很少需要直接處理符號(hào),除了"在語(yǔ)言上編程"(programmingonthe
language)(Computingonthelanguage)。
>y<-4
>y
[1]4
3.1.3函數(shù)調(diào)用
R里面的很多計(jì)算都有函數(shù)求值,我們也把這稱之為函數(shù)詞用(invocation)。
函數(shù)調(diào)用通過(guò)名字和一個(gè)以逗號(hào)分割的參數(shù)列表來(lái)實(shí)現(xiàn)。
>mean(l:10)
[1]5.5
在這個(gè)例子中,函數(shù)mean的調(diào)用過(guò)程中只有一個(gè)參數(shù),就是含有1到10之
間整數(shù)的向量。
R含有許多用于各種目的的函數(shù)。大多數(shù)用來(lái)產(chǎn)生一個(gè)屬于R對(duì)象的結(jié)果,但
其它一些函數(shù)則利用了它們的副作用,如打印和繪圖函數(shù)。
函數(shù)調(diào)用可以用標(biāo)斜示記的參數(shù)(或份名參數(shù)),而在plot(x,y,pch=3)中,
一些參數(shù)沒(méi)有標(biāo)簽,這些參數(shù)通過(guò)々置識(shí)別。此時(shí),函數(shù)必須通過(guò)參數(shù)在參數(shù)列
表中所處的序列順序來(lái)判斷它們的意義。因此前面的例子中,x表示橫坐標(biāo)變
量,y表示縱坐標(biāo)變量。使用標(biāo)簽/名字對(duì)含有很多可選參數(shù)的函數(shù)非常方便。
一個(gè)特別的函數(shù)調(diào)用可以出現(xiàn)在賦值操作符的左邊,如下所示
>class(x)<-"foo"
該語(yǔ)句實(shí)際所做的就是利用原始的對(duì)象和右邊部分調(diào)用函數(shù)該函數(shù)對(duì)
class<-o
對(duì)象進(jìn)行修改,返回結(jié)果存入原始變量(至少在概念上,這就是所發(fā)生的事情。
可能,一些額外的努力將用于避免不必要的數(shù)據(jù)重復(fù)。)
3.1.4操作符
R允許使用C語(yǔ)言類似的操作符構(gòu)建算術(shù)表達(dá)式,例如,
>1+2
[1]3
表達(dá)式可以用括號(hào)合并成組,混以函數(shù)調(diào)用,然后以一種直接的方式賦給變量
>y<-2*(a+log(x))
R含有一系列操作符。它們?nèi)缦卤硭尽?/p>
-減號(hào),一元操作符或者二元操作符
+加號(hào),一元操作符或者二元操作符
!一元否操作符
~波浪號(hào),用于模型公式,既可以是一元操作符也可以是二元操作符
?幫助
:序列,二元操作符(在模型公式中,表示交互效應(yīng))
*乘法,二元操作符
/除法,二元操作符
A幕運(yùn)算符,二元操作符
%A%特殊二元操作符,x可以被任意合法的名字替換
%%求模,二元操作符
%/%整除,二元操作符
%*%矩陣相乘,二元操作符
%o%外積,二元操作符
%x%Kronecker乘積,二元操作符
%in%匹配操作,二元操作符(在模型公式中,表示嵌套)
小于,二元操作符
>大于,二元操作符
==等于,二元操作符
>=大于等于,二元操作符
<=小于等于,二元操作符
&與操作,二元操作符,向量模式
&&與操作,二元操作符,不是向量模式
I或操作,二元操作符,向量模式
II或操作,二元操作符,不是向量模式
<-左賦值,二元操作符
->右賦值,二元操作符
$列表子集,二元操作符
除了語(yǔ)法上,操作符使用和函數(shù)調(diào)用沒(méi)有差異。事實(shí)上,x+y和"+"(x,y)等
價(jià)。注意既然+不是一個(gè)標(biāo)準(zhǔn)的函數(shù)名字,,那么它就需要被引號(hào)括起來(lái)。
R同時(shí)處理數(shù)據(jù)的整個(gè)向量,并且大多數(shù)元素操作符和基本的數(shù)學(xué)函數(shù)如log
是向量模式的(和上面表格中提示的一樣)。這意味著如果兩個(gè)一樣長(zhǎng)度的向量
相加會(huì)隱式依據(jù)向量索引循環(huán)計(jì)算得到一個(gè)含有元素方式加和結(jié)果的向量這種
用法同樣適合其它操作符,如-,*,和/,以及可以推廣到更高維的結(jié)構(gòu)。需要
注意的是,兩個(gè)矩陣的相乘不會(huì)得到通常的矩陣乘積(%*%操作符用于這種目
的)。一些和向量操作相關(guān)的要點(diǎn)將會(huì)在日ementaryarithmeticoperations
部分討論。
為訪問(wèn)向量的某個(gè)元素,我們常常使用X[i]語(yǔ)句。
>x<-rnorm(5)
>x
[1]-0.12526937-0.27961154-1.03718717-0.08156527
1.37167090
>x[2]
[1]-0.2796115
列表分量則更多地用x$a和x[[i]]方式訪問(wèn)。
>x<-options()
>x$prompt
[1]">"
索引構(gòu)造(Indexingconstructs)同樣可以出現(xiàn)在一個(gè)賦值操作的右邊。和其
它操作符類似,索引實(shí)際上也是通過(guò)函數(shù)實(shí)現(xiàn),可以用(代替
"["X,2)x[2]o
R的索引操作含有許多高級(jí)特性。這部分內(nèi)容將在Indexing部分進(jìn)一步描述。
3.2控制結(jié)構(gòu)
R里面的計(jì)算包括順序地對(duì)z吾網(wǎng)值。程序語(yǔ)句,如x<-l:10或mean(y),可
以被分號(hào)或者新的一行分割。只要整個(gè)語(yǔ)句在語(yǔ)法上是完整的,該語(yǔ)句就會(huì)被
求值并且將頒回。一個(gè)語(yǔ)句的求值結(jié)果可以看作是該語(yǔ)句的值工這個(gè)值通常
會(huì)賦給一個(gè)符號(hào)。
分號(hào)和換行符可以用來(lái)分隔程序語(yǔ)句,分號(hào)一般表示一個(gè)語(yǔ)句的結(jié)束而新的一行
只是有句癖示一個(gè)語(yǔ)句的結(jié)束。如果當(dāng)前語(yǔ)句在語(yǔ)法上還不完整,換行符會(huì)
被求值程序忽略掉,如果會(huì)話(session)是交互式的,提示符會(huì)從>變?yōu)?。
>x<-0;x+5
[1]5
>y<-1:10
>1;2
[1]1
[1]2
語(yǔ)句可以用{和}組合在一起一組這樣的語(yǔ)句有時(shí)會(huì)被稱為每次()
blocko
單個(gè)語(yǔ)句會(huì)在其語(yǔ)法完整后鍵入新的一行時(shí)求值,句塊不會(huì)求值,直到在一個(gè)封
閉的大括號(hào)后面鍵入新的一行。這一節(jié)余下的部分,2吾功要么指單個(gè)語(yǔ)句要么
指句塊。
>{x<-0
+x+5
+}
[1]5
?K:if語(yǔ)句
?Looping:循環(huán)控制
?repeat:repeat語(yǔ)句
?while:while語(yǔ)句
?for語(yǔ)句
?switch:switch語(yǔ)句
Footnotes
[1]求值常常在一個(gè)環(huán)境中進(jìn)行。具體參考Scope"variables。
3.2.1if語(yǔ)句
if/else語(yǔ)句有條件地對(duì)兩個(gè)語(yǔ)句求值該句式的條件語(yǔ)句會(huì)被求值,如果它的值
是TRUE那么第一個(gè)語(yǔ)句將會(huì)被執(zhí)行;否則第二個(gè)語(yǔ)句會(huì)被執(zhí)行。if/else語(yǔ)
句返回所選語(yǔ)句求值結(jié)果并作為它的值。語(yǔ)法形式為
if(statementl)
statement2
else
statements
首先,statementl被求值得到valued如果va/uel是一個(gè)首元素為TRUE
的邏輯向量,那么statement2將會(huì)被求值。如果va/uel的第一個(gè)元素是
FALSE那么Ua招將會(huì)被求值。如果是一個(gè)數(shù)值向量,那么
statements在va/uel的第一個(gè)元素是零的時(shí)候求值,否則statement2將
會(huì)被求值。只有valuel的第一個(gè)元素才會(huì)被使用。其它元素都會(huì)被忽略的。
如果valuel是邏輯和數(shù)值向量以外的向量,將會(huì)返回錯(cuò)誤。
If/else語(yǔ)句可以用來(lái)防止一些數(shù)值計(jì)算問(wèn)題,如對(duì)負(fù)數(shù)進(jìn)行對(duì)數(shù)操作。因?yàn)?/p>
if/else語(yǔ)句和其它語(yǔ)句一樣,你可以把它們的值賦給其它變量。下面的兩個(gè)例
子等價(jià)。
>if(any(x<=0))y<-log(l+x)elsey<-log(x)
>y<-if(any(x<=0))log(l+x)elselog(x)
else子句是可選的。語(yǔ)句if(any(x<=0))x<-x[x<=0]是合法的。如果if
語(yǔ)句不在一個(gè)句塊中,那么else子句(假定存在)必須和statementl在同一
行;否則,在statementl后的新一行將產(chǎn)生一個(gè)語(yǔ)法上完整并會(huì)被求值的語(yǔ)句
If/else語(yǔ)句可以被嵌套。
if(statementl)
statement2
elseif(statements)
statement4
elseif(statements)
statements
else
statements
一個(gè)偶數(shù)編號(hào)的語(yǔ)句將會(huì)被求值并且返回結(jié)果值。如果忽略可選的else子句,
并且所有奇數(shù)編號(hào)的statement的值都是FALSE,那么就沒(méi)有語(yǔ)句會(huì)被求值
則返回NULL。
奇數(shù)編號(hào)的shfeme耐會(huì)依次求值,直到一個(gè)值為TRUE,然后對(duì)應(yīng)的偶數(shù)編
號(hào)的statement會(huì)被求值。在這個(gè)例子中,statements當(dāng)且僅當(dāng)
statementl為FALSE,statements為FALSE和statements是TRUE
的情況下才會(huì)被求值。elseif子句的數(shù)目是沒(méi)有限制的。
3.2.2循環(huán)控制
R有三種語(yǔ)句實(shí)現(xiàn)顯式的循環(huán)控制。i它們分別是for,while和repeat.兩
個(gè)內(nèi)置的構(gòu)造next和break提供了對(duì)求值過(guò)程額外的控制。這三個(gè)語(yǔ)句都返
回最后語(yǔ)句的求值結(jié)果。因此,可以把這些語(yǔ)句的結(jié)果值賦給一個(gè)符號(hào),盡管這
種做法不太常見(jiàn)R還提供了其它一些隱式的循環(huán)控制函數(shù),如tapply,apply
和I叩ply。此外,許多操作,特別算術(shù)操作,都是向量模式的,因此你可能不
太需要使用循環(huán)。
有兩種語(yǔ)句可用于顯式地循環(huán)控制。它們是break和next,break語(yǔ)句可以
從當(dāng)前運(yùn)行的最內(nèi)部的循環(huán)里面跳出next語(yǔ)句會(huì)導(dǎo)致控制立即返回到循環(huán)的
起點(diǎn),循環(huán)的下一次重復(fù)(如還有重復(fù)的話)然后被執(zhí)行。當(dāng)前循環(huán)中,next后
面的語(yǔ)句不會(huì)被執(zhí)行。
Footnotes
[1]循環(huán)指的是對(duì)某個(gè)語(yǔ)句或者語(yǔ)句塊進(jìn)行循環(huán)求值。
3.2.3repeat語(yǔ)句
repeat語(yǔ)句會(huì)重復(fù)對(duì)主體部分求值直到明確地要求退出。這就意味著你必須小
心使用repeat,因?yàn)榭赡軐?dǎo)致死循環(huán)。repeat循環(huán)的語(yǔ)法如下
repeatstatement
在使用repeat語(yǔ)句時(shí),statement必須是一個(gè)句塊。另外,你需要執(zhí)行一些
計(jì)算并且測(cè)試語(yǔ)句是否會(huì)從循環(huán)里面跳出。這樣做通常需要兩條語(yǔ)句。
3.2.4while語(yǔ)句
while語(yǔ)句和repeat語(yǔ)句非常的類似。while循環(huán)的語(yǔ)法如下
while(statementl)statement2
其中statementl會(huì)被求值,如果它的值是TRUE那么sfateme”以會(huì)被執(zhí)
行。這個(gè)過(guò)程重復(fù)直到statementl的值是FALSE。如果statement2從來(lái)
都沒(méi)有被執(zhí)行,那么while語(yǔ)句返回NULL,否則它將會(huì)返回最后一次執(zhí)行
statement2所得到的值。
3.2.5for語(yǔ)句
for循環(huán)的語(yǔ)法如下
for(nameinvector]
statementl
其中醫(yī)或“既可以是向量也可以是列表。蚱或。7?里面每個(gè)元素的值都會(huì)賦給
變量name,然后執(zhí)行statement,一個(gè)副作用是循環(huán)結(jié)束后,變量name
在循環(huán)退出后仍存在,并且它的值就是vector最后一個(gè)元素的值。
3.2.6switch語(yǔ)句
技術(shù)層面上來(lái)說(shuō),switch僅僅是一個(gè)函數(shù),但是它的語(yǔ)義學(xué)定義和其它程序語(yǔ)
句的控制結(jié)構(gòu)類似。
它的語(yǔ)法如下
switch{statement,list}
其中//身的元素可能有自己的名字。首先,S3mme示被求值得到結(jié)果
value。如果value是1到//身長(zhǎng)度間的一個(gè)數(shù)字,那么低1對(duì)應(yīng)元素將會(huì)被
求值并返回結(jié)果。如果value值過(guò)大或者過(guò)小,NULL將會(huì)被返回。
>x<-3
>switch(x,2+2,mean(l:10),rnorm(5))
[1]2.29036052.3271663-0.70600731.3622045-0.2892720
>switch(2,2+2,mean(l:10),rnorm(5))
[1]5.5
>switch(6,2+2,mean(l:10),rnorm(5))
NULL
如果value是字符向量,那么…的元素中名字和value準(zhǔn)確匹配的元素會(huì)被
執(zhí)行。如果沒(méi)有匹配的,返回NULL.
>y<-"fruit"
>switch(y,fruit="banana",vegetable="broccoli",meat="beef")
[1]"banana"
switch常用來(lái)根據(jù)函數(shù)一個(gè)參數(shù)的字符值決定后面的執(zhí)行語(yǔ)句。
>centre<-function(x,type){
+switch(type,
+mean=mean(x),
+median=median(x),
+trimmed=mean(x,trim=.1))
+}
>x<-rcauchy(lO)
>centre(x,"mean")
[1]0.8760325
>centre(x,"median")
[1]0.5360891
>centre(x,"trimmed")
[1]0.6086504
switch返回值要么是語(yǔ)句的求值結(jié)果要么在沒(méi)有語(yǔ)句被求值時(shí)的NULL
為了從一個(gè)已經(jīng)存在的可選方法列表里面選擇一個(gè),switch可能不是最好的實(shí)
現(xiàn)方案,通常,用eval和子集操作符[[直接運(yùn)行eval(x[[condition]])會(huì)更
好。
3.3初等算術(shù)操作
?Recyclingrules:循環(huán)使用規(guī)則
?Propagationofnames:名字?jǐn)U散
?Dimensionalattributes:維度屬性
?NAhandling:NA處理
在本節(jié),我們將會(huì)討論用于基本操作符(如兩個(gè)向量或矩陣的加法和乘法)的一
些規(guī)則要點(diǎn)。
3.3.1循環(huán)使用規(guī)則
如果兩個(gè)元素個(gè)數(shù)不一致的數(shù)據(jù)結(jié)構(gòu)相加,那么短的那個(gè)結(jié)構(gòu)會(huì)循環(huán)使用以達(dá)到
長(zhǎng)的結(jié)構(gòu)的長(zhǎng)度。例如,將c(l,2,3)和一個(gè)6元素長(zhǎng)度的向量相加,你實(shí)際操
作的是c(l,2,3,1,2,3)0如果長(zhǎng)向量的長(zhǎng)度不是短向量的倍數(shù),一個(gè)警告將會(huì)
給出。
從R1.4.0開(kāi)始,任何含零長(zhǎng)度向量的算術(shù)操作結(jié)果都是零長(zhǎng)度向量。
一個(gè)例外是,當(dāng)一個(gè)向量和矩陣相加的時(shí)候,如果長(zhǎng)度不協(xié)調(diào),不會(huì)給出任何警
告。
3.3.2名字?jǐn)U散
名字?jǐn)U散(第一個(gè)名字優(yōu)先。如果它沒(méi)有名字的,是不是也這樣??——第一
個(gè)*擁有名字*的優(yōu)先,循環(huán)使用導(dǎo)致短的結(jié)構(gòu)丟失名字)。i
Footnotes
[1]譯者:主:原句為"propagationofnames(firstonewins,Ithink-alsoif
ithasnonames??——firstone*withnames*wins,recyclingcauses
shortesttolosenames)”
3.3.3維度屬性
(矩陣+矩陣,維度必須匹配。向量+矩陣:第一個(gè)重復(fù)使用,然后檢驗(yàn)維度是
否匹配,否則就報(bào)錯(cuò))
3.3.4NA處理
統(tǒng)計(jì)學(xué)意義上缺失變量(值不知道的變量)的值是這和一個(gè)函數(shù)參數(shù)的
NAO
missing特性(即一個(gè)函數(shù)的參數(shù)沒(méi)有提供)不能混淆(見(jiàn)Arguments)。因
為原子向量的元素必須是一樣的類型,因此NA值有多種類駕有一種情況對(duì)用
戶非常重要。NA的默認(rèn)類型是logical,除非強(qiáng)制轉(zhuǎn)換成其它類型,因此缺失
值可能會(huì)觸發(fā)邏輯索引而不是數(shù)值索引(細(xì)節(jié)見(jiàn)Indexing)。
含的數(shù)值和邏輯計(jì)算通常返回如果對(duì)于所有取值運(yùn)算結(jié)果都一
NANAONA
樣,那么就返回這個(gè)一樣的值。特別是,F(xiàn)ALSE&NA結(jié)果是FALSE,TRUE
|NA結(jié)果是TRUE。NA不等于任何其它值(包括自身);測(cè)試一個(gè)對(duì)象是
否為NA應(yīng)該用is.na但是,在函數(shù)match里面,NA可以匹配另外一個(gè)NA
值。
結(jié)果不明確的數(shù)值計(jì)算(如)返回結(jié)果是這僅僅發(fā)生在實(shí)數(shù)的
0/0NaNo
double類型或者復(fù)數(shù)的虛部中。函數(shù)is.nan用于檢驗(yàn)一個(gè)對(duì)象是否是
NaN,函數(shù)is.na對(duì)NaN也返回TRUE。把NaN強(qiáng)制轉(zhuǎn)換成邏輯型或整型
將返回對(duì)應(yīng)類型的NA,但是強(qiáng)制轉(zhuǎn)換成字符型將返回"NaN"。NaN是不可
比較的,因此檢驗(yàn)NaN是否相等的式子將返回NA通過(guò)match可以匹配NaN
值(其它值不行,甚至是NA)。
NA的字符類型從R1.5.0開(kāi)始才和字符"NA"區(qū)分開(kāi)。程序員如果需要指定
一個(gè)外在的字符串型NA,應(yīng)該使用as.character(NA)而不是"NA",或者用
is.na<-對(duì)NA設(shè)置元素。
原味型向量沒(méi)有NA值。
3.4索引
R有多種構(gòu)造允許通過(guò)索引操作來(lái)訪問(wèn)單個(gè)元素或者子集。在基本的向量類型
中,可以通過(guò)x[i]訪問(wèn)第i個(gè)元素,但在列表,矩陣和多維數(shù)組中也有索引。除
了用單個(gè)的整數(shù)進(jìn)行索引,還有多種形式的索引。索引既可用于提取對(duì)象的一部
分,也可用于替換對(duì)象的一部分(或者增加一部分)。
R有三種基本的索引操作。語(yǔ)法如下面的例子所示
x[i]
x[i,j]
x[[i]]
x[[i,j]]
x$a
x$"a"
對(duì)于向量和矩陣,[[形式很少使用,盡管它和[在語(yǔ)義上稍稍有點(diǎn)不同(例如它去
掉了所有names或dimnames屬性,并且在字符索引的時(shí)候采用局部匹配)。
當(dāng)用單個(gè)索引處理多維結(jié)構(gòu)時(shí),x[[i]]或者x[i]將會(huì)返回x的第i個(gè)元素。
對(duì)于一個(gè)列表,通常使用[[去選擇任意單個(gè)的元素,而[返回所選元素的列表
[[形式允許使用整數(shù)或字符索引選出單個(gè)的元素,而[允許通過(guò)向量進(jìn)行索
弓I。注意,對(duì)于一個(gè)列表,索引可以使用向量然后向量的任何一個(gè)元素將依次用
于列表,所選的分量,所選分量的分量,等等。i返回結(jié)果仍然是單個(gè)元素。
$形式用于列表和成對(duì)列表的遞歸對(duì)象。它僅僅允許字面上的字符串和符號(hào)作為
索引。也就是說(shuō),這種索引不可計(jì)算的:當(dāng)你需要通過(guò)對(duì)一個(gè)表達(dá)式求值確定一
個(gè)索引,請(qǐng)使用當(dāng)$用于非遞歸對(duì)象時(shí),返回結(jié)果是。
x[[expr]]oNULL
?Indexingbyvectors:通過(guò)向量進(jìn)行索引
?Indexingmatricesandarrays:矩陣和數(shù)組的索引操作
?Indexingotherstructures:其它結(jié)構(gòu)的索引操作
?Subsetassignment:子集賦值
Footnotes
[1]譯者注:我測(cè)試了一下,和這里描述的不一樣原文為:"Notethoughthat
foralist,theindexcanbeavectorandeachelementofthevectoris
appliedinturntothelist,theselectedcomponent,theselected
componentofthatcomponent,andsoon.”
3.4.1通過(guò)向量進(jìn)行索引
通過(guò)向量作為索引,R實(shí)現(xiàn)了一些功能非常強(qiáng)大的構(gòu)造首先我們將會(huì)討論簡(jiǎn)單
向量的索引。為了簡(jiǎn)單起見(jiàn),假定表達(dá)式是依據(jù)類型的不同,有下面幾
x[i]oi
種情況。
?整數(shù)。i的所有元素必須是一樣的符號(hào)。如果它們是正數(shù),x中下標(biāo)和這
些數(shù)字一樣的元素將會(huì)被選中。i中的元素是負(fù)數(shù),那么除這些數(shù)字對(duì)
應(yīng)的元素外的所有元素被選中。
如果是正數(shù),并且大于那么對(duì)應(yīng)的所選元素是里
ilength(x),NAOi
面有超過(guò)一定范圍的負(fù)數(shù)會(huì)導(dǎo)致一個(gè)錯(cuò)誤。
一個(gè)特別的例子是零索引,它不會(huì)有任何影響:x[0]是一個(gè)空向量并且其
它含有零的正整數(shù)或負(fù)整數(shù)索引有一樣的效果因?yàn)榱闼饕龝?huì)被忽略。
?其它數(shù)值非整數(shù)值在作為索引前會(huì)被轉(zhuǎn)換成整數(shù)(直接去掉小數(shù)部分\
?邏輯值索引i通常和x長(zhǎng)度一致。如果它比較短,那么它的元素將會(huì)被
循環(huán)使用(見(jiàn)Elementaryarithmeticoperations)如果它的長(zhǎng)度過(guò)長(zhǎng),
那么x在概念上會(huì)被NA擴(kuò)展從x中選中的元素將是對(duì)應(yīng)位置上i是
TRUE的元素。
?字符,i里面的字符串和x的名字屬性進(jìn)行匹配,其結(jié)果整數(shù)將會(huì)被使用
在精確匹配失敗后,口和$都采用局部匹配,因此如果x沒(méi)有一個(gè)分量
的名字為"aa"并且"aabb"是第一個(gè)以"aa"作
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國(guó)電話/傳呼報(bào)警器數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 現(xiàn)代企業(yè)品牌建設(shè)策略與實(shí)踐
- 2025至2030年中國(guó)焊接圓風(fēng)管數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 委托裝修出售合同范本
- 勞動(dòng)關(guān)系的合同范本
- 物種保護(hù)與生態(tài)系統(tǒng)平衡的關(guān)系
- 水泥供需合同范本
- 民居托管改造合同范本
- 科技賦能下的移動(dòng)支付與網(wǎng)絡(luò)安全創(chuàng)新
- 信托行業(yè)的創(chuàng)新能力考核試卷
- 2025年哈爾濱職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)完美版
- 私募股權(quán)投資基金基礎(chǔ)知識(shí)-《私募股權(quán)投資基金基礎(chǔ)知識(shí)》高分通關(guān)卷5
- 老年重癥患者靜脈血栓栓塞癥預(yù)防中國(guó)專家共識(shí)(2023)解讀
- 北師大版四年級(jí)數(shù)學(xué)下冊(cè)期末測(cè)試卷(一)(含答案)
- 2025年云南省曲靖市富源縣能源局公開(kāi)招聘引進(jìn)煤礦安全監(jiān)管急需緊缺人才筆試高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 《抗菌藥物合理運(yùn)用》課件
- 大學(xué)生創(chuàng)新創(chuàng)業(yè)基礎(chǔ)教程(高職“創(chuàng)新創(chuàng)業(yè)”課程)全套教學(xué)課件
- 中小學(xué)傳統(tǒng)文化教育指導(dǎo)標(biāo)準(zhǔn)
- 霍尼韋爾DDC編程軟件(CARE)簡(jiǎn)介
- 實(shí)用中西醫(yī)結(jié)合診斷治療學(xué)
- 論《說(shuō)文解字》中的水文化
評(píng)論
0/150
提交評(píng)論