2019年R語(yǔ)言定義課件_第1頁(yè)
2019年R語(yǔ)言定義課件_第2頁(yè)
2019年R語(yǔ)言定義課件_第3頁(yè)
2019年R語(yǔ)言定義課件_第4頁(yè)
2019年R語(yǔ)言定義課件_第5頁(yè)
已閱讀5頁(yè),還剩117頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論