R是一種基于對象(Object)的語言,所以你在R語言中接觸到的每樣?xùn)|西都是一個對象,一串?dāng)?shù)值向量是一個對象,一個函數(shù)是一個對象,一個圖形也是一個對象?;趯ο蟮木幊?OOP)就是在定義類的基礎(chǔ)上,創(chuàng)建與操作對象。
對象中包含了我們需要的數(shù)據(jù),同時對象也具有很多屬性(Attribute)。其中一種重要的屬性就是它的類(Class),R語言中最為基本的類包括了數(shù)值(numeric)、邏輯(logical)、字符(character)、列表(list),在此基礎(chǔ)上構(gòu)成了一些復(fù)合型的類,包括矩陣(matrix)、數(shù)組(array)、因子(factor)、數(shù)據(jù)框(dataframe)。除了這些內(nèi)置的類外還有很多其它的,用戶還可以自定義新的類,但所有的類都是建立在這些基本的類之上的。
我們下面來用一個簡單線性回歸的例子來了解一下對象和類的處理。
# 創(chuàng)建兩個數(shù)值向量x <-runif(100) y <-rnorm(100)+5*x# 用線性回歸創(chuàng)建模型,存入對象modelmodel <-lm(y~x)
好了,現(xiàn)在我們手頭上有一個不熟悉的對象model,那么首先來看看它里面藏著什么好東西。最有用的函數(shù)命令就是attributes(model),用來提取對象的各種屬性,結(jié)果如下:
> attributes(model)names[1]"coefficients""residuals""effects"[4]"rank""fitted.values""assign"[7]"qr""df.residual""xlevels"[10]"call""terms""model"class
[1] "lm"
可以看到這個對象的類是“l(fā)m”,這意味著什么呢?我們知道對于不同的類有不同的處理方法,那么對于modle這個對象,就有專門用來處理lm類對象的函數(shù),例如plot.lm()。但如果你用普通的函數(shù)plot()也一樣能顯示其圖形,Why?因?yàn)閜lot()這種函數(shù)會自動識別對象的類,從而選擇合適的函數(shù)來對付它,這種函數(shù)就稱為泛型函數(shù)(generic function)。你可以用methods(class=lm)來了解有哪些函數(shù)可適用于lm對象。
好了,我們已經(jīng)知道了model的底細(xì)了,你還想知道x的信息吧。如果運(yùn)行attributes(x),會發(fā)現(xiàn)返回了空值。這是因?yàn)閤是一個向量,對于向量這種內(nèi)置的基本類,attributes是沒有什么好顯示的。此時你可以運(yùn)行mode(x),可觀察到向量的類是數(shù)值型。如果運(yùn)行mode(model)會有什么反應(yīng)呢?它會顯示lm類的基本構(gòu)成是由list組成的。當(dāng)然要了解對象的類,也可以直接用class(),如果要消除對象的類則可用unclass()。
從上面的結(jié)果我們還看到names這個屬性,這如同你到一家餐廳問服務(wù)生要一份菜單,輸入names(model)就相當(dāng)于問model這個對象:Hi,你能提供什么好東西嗎?如果你熟悉回歸理論的話,就可以從names里頭看到它提供了豐富的回歸結(jié)果,包括回歸系數(shù)(coefficients)、殘差(residuals)等等,調(diào)用這些信息可以就象處理普通的數(shù)據(jù)框一樣使用符號,例如輸出殘差可以用符號,例如輸出殘差可以用modelresiduals。當(dāng)然用泛型函數(shù)可以達(dá)到同樣的效果,如residuals(model),但在個別情況下,這二者結(jié)果是有少許差別的。
我們已經(jīng)知道了attributes的威力了,那么另外一個非常有用的函數(shù)是str(),它能以簡潔的方式顯示對象的數(shù)據(jù)結(jié)構(gòu)及其內(nèi)容,試試看,非常有用的。








暫無數(shù)據(jù)