版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、實驗?zāi)康膶嶒災(zāi)康膶嶒瀮?nèi)容實驗內(nèi)容學(xué)習(xí)學(xué)習(xí)S語言中語言中離散變量、混合數(shù)據(jù)的表示方法的表示方法1 1、數(shù)據(jù)表示方法、數(shù)據(jù)表示方法2 2、應(yīng)用實例、應(yīng)用實例3 3、實驗作業(yè)、實驗作業(yè)因子、列表、數(shù)據(jù)框因子、列表、數(shù)據(jù)框因子和有序因子 統(tǒng)計中的變量重要類別: 區(qū)間變量和名義變量、有序變量。 區(qū)間變量取連續(xù)的數(shù)值,可以進行求和、平均等運算。 名義變量和有序變量取離散值,既可用數(shù)值代表也可用字符型值,其具體數(shù)值沒有數(shù)量意義,不能用于加減乘除計算而只能用來分類或者計數(shù)。名義變量比如性別、省份、職業(yè),有序變量比如班級名次。 因為離散變量有各種不同表示方法,在S中為統(tǒng)一起見使用因子(factor)來表示這種分
2、類變量。還提供了有序因子(ordered factor)來表示有序變量。 因子是一種特殊的字符型向量,其中每一個元素取一組離散值中的一個,而因子對象有一個特殊屬性levels表示這組離散值(用字符串表示)。例如: x y y 1 男 女 男 男 女 Levels: 男 女 函數(shù)factor()用來把一個向量編碼成為一個因子。一般形式為:factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE) 可以自行指定各離散取值(水平levels),不指定時由x的不同值來求得。 lab
3、els可以用來指定各水平的標(biāo)簽,不指定時用各離散取值的對應(yīng)字符串。 exclude參數(shù)用來指定要轉(zhuǎn)換為缺失值(NA)的元素值集合。如果指定了levels,則因子的第i個元素當(dāng)它等于水平中第j個時元素值取“j”,如果它的值沒有出現(xiàn)在levels中則對應(yīng)因子元素值取NA。 ordered取真值時表示因子水平是有次序的(按編碼次序)。 可以用is.factor()檢驗對象是否因子,用as.factor()把一個向量轉(zhuǎn)換成一個因子。 x=c(1,0,1,1,0) y=factor(x,levels=sort(unique(x),decreasing=T),labels=c(男, 女),exclude=
4、NA,order=F) y1 男 女 男 男 女 Levels: 男 女 x=c(1,0,1,1,0,2)y=factor(x,levels=c(1,0),labels=c(男, 女),exclude=NA,order=F) y1 男 女 男 男 女 Levels: 男 女 因子的基本統(tǒng)計是頻數(shù)統(tǒng)計,用函數(shù)table()來計數(shù)。例如, sex = factor(c(男, 女, 男, 男, 女) res.tab res.tab 男 女 3 2 表示男性3人,女性2人。table()的結(jié)果是一個帶元素名的向量,元素名為因子水平,元素值為該水平的出現(xiàn)頻數(shù)。 S的結(jié)果除了可以顯示外,本身都是S對象(如
5、這里的向量結(jié)果),可以很方便地進一步處理。 可以用兩個或多個因子進行交叉分類。比如,性別(sex)和職業(yè)(job)交叉分組可以用table(sex, job)來統(tǒng)計每一交叉類的頻數(shù),結(jié)果為一個矩陣,矩陣帶有行名和列名,分別為兩個因子的各水平名。 因子可以用來作為另外的同長度變量的分類變量。比如,假設(shè)上面的sex是5個學(xué)生的性別,而 h tapply(h, sex, mean) 可以求按性別分類的身高平均值。 這樣用一個等長的因子向量對一個數(shù)值向量分組的辦法叫做不規(guī)則數(shù)組(ragged array)。后面我們還可以看到更多的因子的應(yīng)用。實驗?zāi)康膶嶒災(zāi)康膶W(xué)習(xí)學(xué)習(xí)S語言中數(shù)據(jù)語言中數(shù)據(jù)列表列表列表(
6、列表(list) 列表定義列表定義 列表是一種特別的對象集合,它的元素也由序號(下標(biāo))區(qū)分,但是各元素的類型可以是任意對象,不同元素不必是同一類型。元素本身允許是其它復(fù)雜數(shù)據(jù)類型,比如,列表的一個元素也允許是列表。 列表元素用“列表名下標(biāo)”的格式引用。 但是,列表不同于向量,我們每次只能引用一個元素,如rec1:2的用法是不允許的。 注意:“列表名下標(biāo)”或“列表名下標(biāo)范圍”的用法也是合法的,但其意義與用兩重括號的記法完全不同,兩重記號取出列表的一個元素,結(jié)果與該元素類型相同,如果使用一重括號,則結(jié)果是列表的一個子列表(結(jié)果類型仍為列表)。 rec = list(name=李明, age=30,
7、 scores=c(85, 76, 90) rec $name 1 李明 $age 1 30 $scores 1 85 76 90 rec1 $name 1 李明 rec1 1 李明 rec2 $age 1 30 rec2 1 30 rec3 $scores 1 85 76 90 rec3 1 85 76 90 rec31:21 85 76 在定義列表時如果指定了元素的名字(如rec中的name,age,scores),則引用列表元素還可以用它的名字作為下標(biāo),格式為“列表名元素名”,如: recage 1 30 另一種格式是“列表名$元素名”,如: rec$age 1 30 其中“元素名”可以
8、簡寫到與其它元素名能夠區(qū)分的最短程度,比如“rec$s”可以代表 “rec$score”。 這種寫法方便了交互運行,編寫程序時一般不用簡寫以免降低程序的可讀性。 使用元素名的引用方法可以讓我們不必記住某一個下標(biāo)代表那一個元素,而直接用易記的元素名來引用元素。事實上,已知向量和矩陣也可以指定元素名、行名、列名。 定義列表使用list()函數(shù),每一個自變量變成列表的一個元素,自變量可以用“名字值”的方式給出,即給出列表元素名。 自變量的值被復(fù)制到列表元素中,自變量如果是變量并不會與該列表元素建立關(guān)系(改變該列表元素不會改變自變量的值)。修改列表 列表的元素可以修改,只要把元素引用賦值即可。 如:
9、rec$age rec$age rec$sex rec6 rec rec$sex rec6 rec $name 1 李明 $age 1 30 $scores 1 85 76 90 $sex 1 男 5 NULL 6 1 161 第五號元素因為沒有定義所有其值是“NULL”,這是空對象的記號。 如果rec是一個向量,則其空元素為“NA”,這是缺失值的記號。從這里我們也可以體會“NULL”與“NA”的區(qū)別。 幾個列表可以用連接函數(shù)c()連接起來,結(jié)果仍為一個列表,其元素為各自變量的列表元素。如: list.ABC ev=eigen(1:3)%o%(1:3) ev $values 1 1.40000
10、0e+01 9.176554e-16 -1.023391e-15 $vectors ,1 ,2 ,3 1, -0.2672612 0.6067775 0.7485937 2, -0.5345225 0.5530299 -0.6390960 3, -0.8017837 -0.5709457 0.1765328特征向量按矩陣存放,每一列為一個特征特征向量。二、奇異值分解及行列式二、奇異值分解及行列式函數(shù)函數(shù)svd()進行奇異值分解進行奇異值分解自學(xué)自學(xué)三、最小二乘擬合與三、最小二乘擬合與QR分解分解 函數(shù)lsfit(x,y)返回最小二乘擬合的結(jié)果。最小二乘的模型為線性模型 lsfit(x,y)的第
11、一個參數(shù)x為模型中的設(shè)計陣 ,第二個參數(shù)y為模型中的因變量y(可以是一個向量也可以是一個矩陣),返回一個列表,成員coefficients為上面模型的 最小二乘系數(shù),成員residuals為擬合殘差,成員intercept用來指示是否有截距項,成員qr為設(shè)計陣 的QR分解,它本身也是一個列表。YX三、最小二乘擬合與三、最小二乘擬合與QR分解分解 關(guān)于最小二乘擬合還可參見ls.diag() 函數(shù)(查看幫助)。 函數(shù)qr(x)返回x的QR分解結(jié)果。矩陣X的QR分解為X=Q*R ,Q為對角線元素都等于1的下三角陣,R為上三角陣。 函數(shù)結(jié)果為一個列表,成員qr 為一個矩陣,其上三角部分(包括對角線)分
12、解的R,其下三角部分(不包括對角線)為分解的Q。其它成員為一些輔助信息。 x=rbind(c(1,2,3),c(4,5,6),c(7,8,9) y=qr(x) y qr.R(y) qr.Q(y) qr.Q(y)%*%qr.R(y) x=rbind(c(1,2,3),c(4,5,6),c(7,8,9) y=qr(x) y$qr ,1 ,2 ,31, -8.1240384 -9.6011363 -1.107823e+012, 0.4923660 0.9045340 1.809068e+003, 0.8616404 0.9954736 -2.220446e-16$rank1 2$qraux1 1.1
13、23091e+00 1.095039e+00 2.220446e-16$pivot1 1 2 3attr(,class)1 qr qr.R(y) ,1 ,2 ,31, -8.124038 -9.601136 -1.107823e+012, 0.000000 0.904534 1.809068e+003, 0.000000 0.000000 -2.220446e-16 qr.Q(y) ,1 ,2 ,31, -0.1230915 0.9045340 0.40824832, -0.4923660 0.3015113 -0.81649663, -0.8616404 -0.3015113 0.40824
14、83 qr.Q(y)%*%qr.R(y) ,1 ,2 ,31, 1 2 32, 4 5 63, 7 8 9數(shù)據(jù)框(data.frame) 數(shù)據(jù)框是S中類似SAS數(shù)據(jù)集的一種數(shù)據(jù)結(jié)構(gòu)。它通常是矩陣形式的數(shù)據(jù),但矩陣各列可以是不同類型的。數(shù)據(jù)框每列是一個變量,每行是一個觀測。 數(shù)據(jù)框有更一般的定義。它是一種特殊的列表對象,有一個值為“data.frame”的class 屬性,各列表成員必須是向量(數(shù)值型、字符型、邏輯型)、因子、數(shù)值型矩陣、列表,或其它數(shù)據(jù)框。向量、因子成員為數(shù)據(jù)框提供一個變量,如果向量非數(shù)值型則會被強制轉(zhuǎn)換為因子,而矩陣、列表、數(shù)據(jù)框這樣的成員為新數(shù)據(jù)框提供了和其列數(shù)、成員數(shù)、變
15、量數(shù)相同個數(shù)的變量。作為數(shù)據(jù)框變量的向量、因子或矩陣必須具有相同的長度(行數(shù))。 盡管如此,我們一般還是可以把數(shù)據(jù)框看作是一種推廣了的矩陣,它可以用矩陣形式顯示,可以用對矩陣的下標(biāo)引用方法來引用其元素或子集。數(shù)據(jù)框生成數(shù)據(jù)框生成 數(shù)據(jù)框可以用data.frame()函數(shù)生成,其用法與list()函數(shù)相同,各自變量變成數(shù)據(jù)框的成分,自變量可以命名,成為變量名。例如: d=data.frame(name=c(趙, 錢, 孫, 李, 王),age=c(20,21,22,21,20),height=c(170,171,175,165,181),gender=c(男, 女, 男, 女, 男 ) d 如果
16、一個列表的各個成分滿足數(shù)據(jù)框成分的要求,它可以用as.data.frame()函數(shù)強制轉(zhuǎn)換為數(shù)據(jù)框。比如,上面的d如果先用list()函數(shù)定義成了一個列表,就可以強制成為一個數(shù)據(jù)框。 一個矩陣可以用data.frame()轉(zhuǎn)換為一個數(shù)據(jù)框,如果它原來有列名則其列名被作為數(shù)據(jù)框的變量名,否則系統(tǒng)自動為矩陣的各列起一個變量名(如X1,X2)。 d name age height gender 1 趙 20 170 男 2 錢 21 171 女 3 孫 22 175 男 4 李 21 165 女 5 王 20 181 男 d1 name 1 趙 2 錢 3 孫 4 李 5 王 d1 1 趙 錢 孫
17、李 王 Levels: 李 錢 孫 王 趙 d22:3 1 21 22數(shù)據(jù)框引用 引用數(shù)據(jù)框元素的方法與引用矩陣元素的方法相同,可以使用下標(biāo)或下標(biāo)向量,也可以使用名字或名字向量。如d1:2, 2:3。數(shù)據(jù)框的各變量也可以用按列表引用(即用雙括號 或$符號引用)。 數(shù)據(jù)框的變量名由屬性names定義,此屬性一定是非空的。數(shù)據(jù)框的各行也可以定義名字,可以用rownames屬性定義。如: names(d) 1 name age height gender rownames(d) 1 1 2 3 4 5 table(d4) 男 女 3 2 table(d4)男 女 3 2 tapply(d3,d4,
18、mean) 男 女 175.3333 168.0000 tapply(d3,d4, mean) 錯誤在tapply(d3, d4, mean) : 變元的長度必需相同 d3/d2 1 8.500000 8.142857 7.954545 7.857143 9.050000attach()函數(shù) 數(shù)據(jù)框的主要用途是保存統(tǒng)計建模需要的數(shù)據(jù)。S的統(tǒng)計建模功能都需要以數(shù)據(jù)框為輸入數(shù)據(jù)。我們也可以把數(shù)據(jù)框當(dāng)成一種矩陣來處理。 在使用數(shù)據(jù)框的變量時可以用“數(shù)據(jù)框名$變量名”的記法。但是,這樣使用較麻煩,S提供了attach()函數(shù)可以把數(shù)據(jù)框“連接”入當(dāng)前的名字空間。例如, attach(d) r d$r
19、cat(i = , i, n) 注意使用cat()時要自己加上換行符“n”。它把各項轉(zhuǎn)換成字符串,中間隔以空格連接起來,然后顯示。 如果要使用自定義的分隔符,可以用sep=參數(shù),例如: cat(c(AB, C), c(E, F), n, sep=) ABCEF cat()還可以指定一個參數(shù)file=給一個文件名,可以把結(jié)果寫到指定的文件中,如: cat(i = , 1, n, file=c:/work/result.txt) 如果指定的文件已經(jīng)存在則原來內(nèi)容被覆蓋。加上一個append=TRUE參數(shù)可以不覆蓋原文件而是在文件末尾附加,這很適用于運行中的結(jié)果記錄。 cat()函數(shù)和print()
20、都不具有很強的自定義格式功能,為此可以使用cat()與format() 函數(shù)配合實現(xiàn)。format()函數(shù)為一個數(shù)值向量找到一種共同的顯示格式然后把向量轉(zhuǎn)換為字符型。例如: format(c(1, 100, 10000) 1 1 100 10000 S-PLUS中的format()函數(shù)功能較強,具有較多的控制參數(shù),請參見幫助。 R中目前format() 函數(shù)功能仍較弱,但R有一個formatC函數(shù)可以提供類似C語言的printf格式功能。formatC對輸入向量的每一個元素單獨進行格式轉(zhuǎn)換而不生成統(tǒng)一格式,例如: formatC(c(1, 10000) 1 1 1e+004 在formatC(
21、)函數(shù)中可以用format=參數(shù)指定C格式類型,如“d”(整數(shù)),“f”(定點實數(shù)),“e”(科學(xué)記數(shù)法),“E”, “g”(選擇位數(shù)較少的輸出格式),“G”, “fg”(定點實數(shù)但用digits 指定有效位數(shù)),“s”(字符串)。 可以用width指定輸出寬度,用digits指定有效位數(shù)(格式為e,E,g,G,fg時)或小數(shù)點后位數(shù)(格式為f)時。可以用flag參數(shù)指定一個輸出選項字符串,字符串中有-表示輸出左對齊,有0表示左空白用0填充,有+表示要輸出正負(fù)號,等等。例如,我們有一個矩陣da中保存了三個日期的年、月、日: da ,1 ,2 ,3 1, 99 1 3 2, 96 11 93,
22、65 5 18 為了輸出這三個日期,可以用apply函數(shù)指定對每一行作用一個輸出函數(shù),此輸出函數(shù)利用cat()和formatC來控制: apply(da, 1, function(r) cat(formatC(r1, format=d, width=2, flag=0), -, formatC(r2, format=d, width=2, flag=0), -, formatC(r3, format=d, width=2, flag=0), n, sep=) 99-01-03 96-11-09 65-05-18 NULL 這里我們知道apply函數(shù)第一個參數(shù)指定了一個矩陣,第二個參數(shù)說明對行操
23、作還是對列操作,第三個參數(shù)是一個函數(shù),這里我們使用了直接定義一個函數(shù)作為參數(shù)的辦法。輸出結(jié)果中多了一個NULL函數(shù),這是因為我們在交互運行,apply的結(jié)果作為一個表達(dá)式的值(NULL )會被顯示出來。 為避免顯示,可以把結(jié)果賦給一個臨時變量名,或者把整個表達(dá)式作為invisible() 函數(shù)的參數(shù),這時不顯示表達(dá)式值。 S的輸出缺省顯示在交互窗口??梢杂胹ink()函數(shù)指定一個文件以把后續(xù)的輸出轉(zhuǎn)向到這個文件,并可用append參數(shù)指定是否要在文件末尾附加: sink(“E:/work/result.txt, append=TRUE) ls() d sink() 調(diào)用無參數(shù)的sink()把輸
24、出恢復(fù)到交互窗口。 write(t(x),file=文件名,nol=nol(x)把一個矩陣X輸出到文件中,把X轉(zhuǎn)置后輸出因為R中矩陣是列優(yōu)先的,如果不轉(zhuǎn)置則輸出是按列輸出的。如果不指定列數(shù)則缺省使用5列。文件名缺省用data. write.table(x,file=文件名)把數(shù)據(jù)框X輸出到文件中,輸出包括變量名表頭和行名。. cl = read.table(“E:/R/class.txt, as.is=c(1), + s=c(Name, Sex, Age, Height, Weight) cl輸入輸入 為了從外部文件讀入一個數(shù)值型向量,S提供了scan()函數(shù)。如果指定了fil
25、e參數(shù)(也是第一參數(shù)),則從指定文件讀入,缺省情況下讀入一個數(shù)值向量,文件中各數(shù)據(jù)以空白分隔,讀到文件尾為止。例如: cat(1:12, n, file=E:/work/result.txt) x y x x V1 V2 V3 1 Zhou 15 3 2 Li Ming 9 李明 3 Zhang 10.2 Wang 讀入結(jié)果為數(shù)據(jù)框。 函數(shù)可以自動識別表列是數(shù)值型還是字符型,并在缺省情況下把字符型數(shù)據(jù)轉(zhuǎn)換為因子(加上as.is=T可以保留字符型不轉(zhuǎn)換)。 函數(shù)自動為數(shù)據(jù)框變量指定“V1 ”、“V2”這樣的變量名,指定“1”、“2”這樣的行名??梢杂胹參數(shù)指定一個字符型向量作為數(shù)
26、據(jù)框的變量名,用s參數(shù)指定一個字符型向量作為數(shù)據(jù)框的行名。 read.table()可以讀入帶有表頭的文件,只要加上header=TRUE參數(shù)即可??梢杂胹ep 參數(shù)指定表行各項的分隔符。例如,為了讀入如下帶有表頭的逗號分隔文件E:d.csv: Name,score, cn Zhou,15,3 Li Ming, 9, 李明 Zhang, 10.2, Wang 使用如下語句: x=read.table(E:/d.csv, header=T, sep=,) x Name score cn 1 Zhou 15.0 3 2 Li Ming 9.0 李明 3 Zhang 10.2 Wan
27、g 其它一些用法見幫助。 cl =read.table(E:/R/class.txt, as.is=c(1), s=c(Name, Sex, Age, Height, Weight); cat(names(cl),names(cl); class.data=read.table(E:/R/class.csv,header=T,sep=,); cat(names(class.data),names(class.data); Edata = read.table(E:/R/Employee data.csv,header=T,sep=,) cat(names(Edata),name
28、s(Edata); read.spss package:foreign R Documentation Read an SPSS data file Description: read.spss reads a file stored by the SPSS save and export commands and returns a list. Usage: read.spss(file, use.value.labels=TRUE, to.data.frame=FALSE, max.value.labels=Inf, s=FALSE) Arguments:
29、file: character variable with the name of the file to read. use.value.labels: Convert variables with value labels into R factors with those levels? to.data.frame: return a data frame? max.value.labels: Only variables with at most this many unique values will be converted to factors s
30、: Trim trailing spaces from factor levels? Details: This uses modified code from the PSPP project for reading the SPSS formats. Occasionally in SPSS value labels will be added to some values of a continuous variable (eg to distinguish different types of missing data), and you will not want these var
31、iables converted to factors. By setting max.val.labels you can specify that variables with a large number of distinct values are not converted to factors even if they have value labels. In addition, variables will not be converted to factors if there are non-missing values that have no value label.
32、The value labels are then returned in the value.labels attribute of the variable. If SPSS variable labels are present, they are returned as the variable.labels attribute of the answer. Fixed length strings (including value labels) are padded on the right with spaces by SPSS, and so are read that way
33、 by R. See the examples for sub for ways to remove trailing spaces in string data. Value: A list (or data frame) with one component for each variable in the saved data set. Note: If SPSS value labels are converted to factors the underlying numerical codes will not in general be the same as the SPSS
34、numerical values, since the numerical codes in R are always 1,2,3,. Author(s): Saikat DebRoy Examples: # Not run: read.spss(datafile) # dont convert value labels to factor levels read.spss(datafile,use.value.labels=FALSE) # convert value labels to factors for variables with at most # ten distinct va
35、lues. read.spss(datafile,max.val.labels=10) # End(Not run)實驗?zāi)康膶嶒災(zāi)康膶嶒瀮?nèi)容實驗內(nèi)容學(xué)習(xí)學(xué)習(xí)S語言中程序設(shè)計方法語言中程序設(shè)計方法1 1、程序設(shè)計程序設(shè)計方法方法2 2、應(yīng)用實例、應(yīng)用實例3 3、實驗作業(yè)、實驗作業(yè)程序設(shè)計程序設(shè)計程序控制結(jié)構(gòu) ?是一個表達(dá)式語言,其任何一個語句都可以看成是一個表達(dá)式。表達(dá)式之間以分號分隔或用換行分隔。表達(dá)式可以續(xù)行,只要前一行不是完整表達(dá)式(比如末尾是加減乘除等運算符,或有未配對的括號)則下一行為上一行的繼續(xù)。 若干個表達(dá)式可以放在一起組成一個復(fù)合表達(dá)式,作為一個表達(dá)式使用。組合用大括號表示,如:
36、 x x S語言也提供了其它高級程序語言共有的分支、循環(huán)等程序控制結(jié)構(gòu)。 分支結(jié)構(gòu) 分支結(jié)構(gòu)包括if結(jié)構(gòu): if (條件) 表達(dá)式1 或 if (條件) 表達(dá)式1 else 表達(dá)式2 其中的“條件”為一個標(biāo)量的真或假值,表達(dá)式可以是用大括號包圍的復(fù)合表達(dá)式。有else 子句時一般寫成: if(條件) 表達(dá)式組 else 表達(dá)式組 這樣的寫法可以使else不至于脫離前面的if。 例如,如果變量lambda為缺失值就給它賦一個缺省值,可用: if(is.na(lambda) lambda 0) & all(log(x)0) y 0) 1 else 0 當(dāng)x是標(biāo)量時這個定義是有效的,但是當(dāng)自
37、變量x是一個向量時,比較的結(jié)果也是一個向量,這時條件無法使用。所以,這個分段函數(shù)應(yīng)該這樣編程: y= numeric(length(x) yx0 - 1 yx=0 - 0 有多個if語句時else與最近的一個配對??梢允褂胕f . else if . else if . else .的多重判斷結(jié)構(gòu)表示多分支。多分支也可以使用switch()函數(shù)。循環(huán)結(jié)構(gòu) 循環(huán)結(jié)構(gòu)中常用的是for循環(huán),是對一個向量或列表的逐次處理,格式為“for( name in values) 表達(dá)式”,如: for(i in seq(along=x) cat(x(, i, ) = , xi, n, sep=); s - s
38、+xi; 這個例子我們需要使用下標(biāo)的值,所以用seq(along=x)生成了x的下標(biāo)向量。 如果不需要下標(biāo)的值,可以直接如此使用: for(xi in x) cat(xi, n) s x = numeric(364) for(i in 1:364) xi= 1 for(j in 0:(i-1) xi= xi * (365-i)/365 xi x for(n in 1:364) xn =1 - prod(365:(365-n+1)/365) 這段程序只用了1秒。注意不能直接去計算365!,這會超出數(shù)值表示范圍。 另外要注意使用for(i in 1:n)格式的計數(shù)循環(huán)時要避免一個常見錯誤,即當(dāng)n為
39、零或負(fù)數(shù)時1:n是一個從大到小的循環(huán),而我們經(jīng)常需要的是當(dāng)n為零或負(fù)數(shù)時就不進入循環(huán)。為達(dá)到這一點,可以在循環(huán)外層判斷循環(huán)結(jié)束值是否小于開始值。 while循環(huán)是在開始處判斷循環(huán)條件的當(dāng)型循環(huán),如: While (b-aeps) c 0) b - c else a ls() 1 A Ai b cl cl.f fit1 g1 marks ns 10 p1 rec tmp.x x x1 x2 x3 y rm(x, x1, x2, x3) ls() 1 A Ai b cl cl.f fit1 g1 marks ns 10 p1 rec tmp.x y ls()可以指定一個pattern參數(shù),此參數(shù)定
40、義一個匹配模式,只返回符合模式的對象名。模式格式是UNIX中g(shù)rep的格式。比如,ls(pattern=tmp.)可以返回所有以“tmp.” 開頭的對象名。 rm()可以指定一個名為list的參數(shù)給出要刪除的對象名,所以rm(list=ls(pattern=“tmp.”) 可以刪除所有以“tmp.”開頭的對象名。 rm(list=ls() 刪除所有對象。函數(shù)定義 S中函數(shù)定義的一般格式為“函數(shù)名= function(參數(shù)表) 表達(dá)式”。定義函數(shù)可以在命令行進行,例如 hello = function() cat(Hello, worldn) ; cat(n) ; hello function
41、() cat(Hello, worldn) ;cat(n) ; hello() Hello, world 函數(shù)體為一個復(fù)合表達(dá)式,各表達(dá)式的之間用換行或分號分開。不帶括號調(diào)用函數(shù)顯示函數(shù)定義,而不是調(diào)用函數(shù)。 在命令行輸入函數(shù)程序很不方便修改,所以我們一般是打開一個其他的編輯程序(如Windows 的記事本),輸入以上函數(shù)定義,保存文件,比如保存到了C:Rhello.R,我們就可以用 source(“E:/R/hello.R) 運行文件中的程序。實際上,用source()運行的程序不限于函數(shù)定義,任何S程序都可以用這種方式編好再運行,效果與在命令行直接輸入是一樣的。 對于一個已有定義的函數(shù),可
42、以用fix()函數(shù)來修改,如: fix(hello) 將打開一個編輯窗口顯示函數(shù)的定義,修改后關(guān)閉窗口函數(shù)就被修改了。fix()調(diào)用的編輯程序缺省為記事本,可以用“options(editor=編輯程序名)”來指定自己喜歡的編輯程序。 函數(shù)可以帶參數(shù),可以返回值,例如: larger = function(x, y) y.is.bigger= (yx); xy.is.bigger = yy.is.bigger; x; 這個函數(shù)輸入兩個向量(相同長度)x和y,然后把x中比y對應(yīng)元素小的元素替換為y中對應(yīng)元素,返回y的值。S返回值為函數(shù)體的最后一個表達(dá)式的值,不需要使用return()函數(shù)。不過,
43、也可以使用“return( 對象)”函數(shù)從函數(shù)體返回調(diào)用者。參數(shù)(自變量) 函數(shù)可以帶虛參數(shù)(形式自變量)。S函數(shù)調(diào)用方式很靈活,例如,如下函數(shù): fsub =function(x, y) x-y 有兩個虛參數(shù)x和y,我們用它計算10045,可以調(diào)用fsub(100,45),或fsub(x=100,y=45) ,或fsub(y=45, x=100),或fsub(y=45, 100)。即調(diào)用時實參與虛參可以按次序結(jié)合,也可以直接指定虛參名結(jié)合。實參先與指定了名字的虛參結(jié)合,沒有指定名字的按次序與剩下的虛參結(jié)合。 函數(shù)在調(diào)用時可以不給出所有的實參,這需要在定義時為虛參指定缺省值。例如上面的函數(shù)改為
44、: fsub = function(x, y=0) x-y 則調(diào)用時除了可以用以上的方式調(diào)用外還可以用fsub(100),fsub(x=100)等方式調(diào)用,只給出沒有缺省值的實參。 即使沒有給虛參指定缺省值也可以在調(diào)用時省略某個虛參,然后函數(shù)體內(nèi)可以用missing() 函數(shù)判斷此虛參是否有對應(yīng)實參,如: trans = function(x, scale) if(!missing(scale) x = scale*x 此函數(shù)當(dāng)給了scale的值時對自變量x乘以此值,否則保持原值。這種用法在其它語言中是極其少見的,S可以實現(xiàn)這一點是因為S的函數(shù)調(diào)用在用到參數(shù)的值時才去計算這個參數(shù)的值(稱為“懶
45、惰求值”),所以可以在調(diào)用時缺少某些參數(shù)而不被拒絕。 S函數(shù)還可以有一個特殊的“.”虛參,表示所有不能匹配的實參,調(diào)用時如果有需要與其它虛參結(jié)合的實參必須用“虛參名”的格式引入。例如: f =function(.) for(x in list(.) cat(min(x), n) f(c(5,1,2), c(9, 4, 7) 1 4 作用域作用域 函數(shù)的虛參完全是按值傳遞的,改變虛參的值不能改變對應(yīng)實參的值。例如: x = list(1, abc) x f =function(x) x2 f(x) x 函數(shù)體內(nèi)的變量也是局部的,對函數(shù)體內(nèi)的變量賦值當(dāng)函數(shù)結(jié)束運行后變量值就刪除了,不影響原來同名變
46、量的值。例如: x = 2 f = function()print(x) ; x= 20 f() 1 2 x 1 2 這個例子中原來有一個變量x值為2,函數(shù)中為變量x賦值20,但函數(shù)運行完后原來的x值并未變化。但是也要注意,函數(shù)中的顯示函數(shù)調(diào)用時局部變量x還沒有賦值,顯示的是全局變量x 的值。這是這是S編程比較編程比較容易出問題的地方:你用到了一個局部變量的值,你容易出問題的地方:你用到了一個局部變量的值,你沒有意識到這個局部變量還沒有賦值,而程序卻沒有沒有意識到這個局部變量還沒有賦值,而程序卻沒有出錯,因為這個變量已有全局定義。出錯,因為這個變量已有全局定義。 程序調(diào)試 S-PLUS和R目前
47、還不象其它主流程序設(shè)計語言那樣具有單步跟蹤、設(shè)置斷點、觀察表達(dá)式等強勁的調(diào)試功能。調(diào)試復(fù)雜的S程序,可以用一些通用的程序調(diào)試方法,另外S也提供了一些調(diào)試用函數(shù)。 對任何程序語言,最基本的調(diào)試手段當(dāng)然是在需要的地方顯示變量的值??梢杂胮rint() 或cat()顯示。例如,我們?yōu)榱苏{(diào)試前面定義的larger()函數(shù),可以顯示兩個自變量的值及中間變量的值: larger x); cat(y.is.bigger = , y.is.bigger, n) ;xy.is.bigger = yy.is.bigger x S提供了一個browser()函數(shù),當(dāng)調(diào)用時程序暫停,用戶可以查看變量或表達(dá)式的值,還可以修改變量。例如: larger= function(x, y) y.is.bigger x);
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年環(huán)保產(chǎn)業(yè)園區(qū)場地租賃及環(huán)境治理合同范本3篇
- 2024年鋰電供貨專屬合同模板
- 專業(yè)化汽車零部件交易合作合同版B版
- 2024煤礦轉(zhuǎn)讓合同范本
- 2024年車位買賣協(xié)議模板版B版
- LED照明安裝及維護服務(wù)協(xié)議版B版
- 三方合作擔(dān)保合同示范文本(2024版)版
- 電工知識培訓(xùn)班課件
- 2024智能充電系統(tǒng)設(shè)備研發(fā)、生產(chǎn)、銷售、品牌建設(shè)一體化合同3篇
- 2024股權(quán)轉(zhuǎn)讓合作協(xié)議書
- 2022年海南省公務(wù)員錄用考試《申論》真題試卷及答案
- 技術(shù)成果轉(zhuǎn)移案例分析報告
- 部編版二年級下冊道德與法治第二單元《我們好好玩》全部教案
- 建筑設(shè)計行業(yè)項目商業(yè)計劃書
- 幼兒園利劍護蕾專項行動工作方案總結(jié)與展望
- 骶尾部藏毛疾病診治中國專家共識(2023版)
- 合同信息管理方案模板范文
- 【高新技術(shù)企業(yè)所得稅稅務(wù)籌劃探析案例:以科大訊飛為例13000字(論文)】
- 幽門螺旋桿菌
- 大足石刻十八講
- 小學(xué)音樂-鈴兒響叮當(dāng)教學(xué)設(shè)計學(xué)情分析教材分析課后反思
評論
0/150
提交評論