R語言編程入門:對象和類

R是一種基於對象(Object)的語言,因此你在R語言中接觸到的每樣東西都是一個對象,一串數值向量是一個對象,一個函數是一個對象,一個圖形也是一個對象。基於對象的編程(OOP)就是在定義類的基礎上,建立與操做對象。php

對象中包含了咱們須要的數據,同時對象也具備不少屬性(Attribute)。其中一種重要的屬性就是它的類(Class),R語言中最爲基本的類包括了數值(numeric)、邏輯(logical)、字符(character)、列表(list),在此基礎上構成了一些複合型的類,包括矩陣(matrix)、數組(array)、因子(factor)、數據框(dataframe)。除了這些內置的類外還有不少其它的,用戶還能夠自定義新的類,但全部的類都是創建在這些基本的類之上的。編程

咱們下面來用一個簡單線性迴歸的例子來了解一下對象和類的處理。
# 建立兩個數值向量x <- runif(100) y <- rnorm(100)+5*x# 用線性迴歸建立模型,存入對象modelmodel <- lm(y~x)數組

好了,如今咱們手頭上有一個不熟悉的對象model,那麼首先來看看它裏面藏着什麼好東西。最有用的函數命令就是attributes(model),用來提取對象的各類屬性,結果以下:數據結構

> attributes(model)
names[1]"coefficients"  "residuals"    "effects"    [4]"rank"      "fitted.values""assign"    [7]"qr"        "df.residual"  "xlevels"    [10]"call"      "terms"      "model"    class
[1] "lm"函數

能夠看到這個對象的類是「lm」,這意味着什麼呢?咱們知道對於不一樣的類有不一樣的處理方法,那麼對於modle這個對象,就有專門用來處理lm類對象的函數,例如plot.lm()。但若是你用普通的函數plot()也同樣能顯示其圖形,Why?由於plot()這種函數會自動識別對象的類,從而選擇合適的函數來對付它,這種函數就稱爲泛型函數(generic function)。你能夠用methods(class=lm)來了解有哪些函數可適用於lm對象。orm

好了,咱們已經知道了model的底細了,你還想知道x的信息吧。若是運行attributes(x),會發現返回了空值。這是由於x是一個向量,對於向量這種內置的基本類,attributes是沒有什麼好顯示的。此時你能夠運行mode(x),可觀察到向量的類是數值型。若是運行mode(model)會有什麼反應呢?它會顯示lm類的基本構成是由list組成的。固然要了解對象的類,也能夠直接用class(),若是要消除對象的類則可用unclass()。對象

從上面的結果咱們還看到names這個屬性,這如同你到一家餐廳問服務生要一份菜單,輸入names(model)就至關於問model這個對象:Hi,你能提供什麼好東西嗎?若是你熟悉迴歸理論的話,就能夠從names裏頭看到它提供了豐富的迴歸結果,包括迴歸係數(coefficients)、殘差(residuals)等等,調用這些信息能夠就象處理普通的數據框同樣使用符號,例如輸出殘差能夠用modelresiduals。固然用泛型函數能夠達到一樣的效果,如residuals(model),但在個別狀況下,這兩者結果是有少量差異的。ci

咱們已經知道了attributes的威力了,那麼另一個很是有用的函數是str(),它能以簡潔的方式顯示對象的數據結構及其內容,試試看,很是有用的。get


本文來自: 人大經濟論壇 S-Plus&R專版 版,詳細出處參考: http://bbs.pinggu.org/forum.php?mod=viewthread&tid=1363234&page=1it

相關文章
相關標籤/搜索