R語言 特殊資料型別S4

2021-07-11 13:06:32 字數 4189 閱讀 1687

1. s4物件介紹

s4物件系統是一種標準的r語言物件導向實現方式,s4物件有明確的類定義,引數定義,引數檢查,繼承關係,例項化等的物件導向系統的特徵。

2. 建立s4物件

為了方便我們檢查物件的型別,引入pryr包作為輔助工具。

library(pryr)

2.1 引數定義

setclass(class, representation, prototype, contains=character(),

validity, access, where, version, sealed, package,

s3methods = false, slots)

class: 定義類名

slots: 定義屬性和屬性型別

prototype: 定義屬性的預設值

contains=character(): 定義父類,繼承關係

validity: 定義屬性的型別檢查

where: 定義儲存空間

sealed: 如果設定true,則同名類不能被再次定義

package: 定義所屬的包

2.2 建立乙個s4物件例項

# 定義乙個s4物件

setclass("person",slots=list(name="character",age="numeric"))

# 例項化乙個person物件

father<-new("person",name="f",age=44)

# 檢視father物件,有兩個屬性name和age

father

# 檢視father物件型別,為person

class(father)

attr(,"package")

# 檢視father物件為s4的物件

> otype(father)

2.3 建立乙個有繼承關係的s4物件

# 建立乙個s4物件person

setclass("person",slots=list(name="character",age="numeric"))

# 建立person的子類

setclass("son",slots=list(father="person",mother="person"),contains="person")

# 例項化person物件

father<-new("person",name="f",age=44)

mother<-new("person",name="m",age=39)

# 例項化乙個son物件

son<-new("son",name="s",age=16,father=father,mother=mother)

# 檢視son物件的name屬性

son@name

# 檢視son物件的age屬性

son@age

# 檢視son物件的father屬性

son@father

slot "age":

# 檢視son物件的mother屬性

slot(son,"mother")

# 檢查son型別

otype(son)

# 檢查son@name屬性型別

otype(son@name)

# 檢查son@mother屬性型別

otype(son@mother)

# 用iss4(),檢查s4物件的型別

iss4(son)

iss4(son@name)

iss4(son@mother)

2.4 s4物件的預設值

setclass("person",slots=list(name="character",age="numeric"))

# 屬性age為空

a<-new("person",name="a")

a# 設定屬性age的預設值20

setclass("person",slots=list(name="character",age="numeric"),prototype = list(age = 20))

# 屬性age為空

b<-new("person",name="b")

# 屬性age的預設值是20

b2.5 s4物件的型別檢查

setclass("person",slots=list(name="character",age="numeric"))

# 傳入錯誤的age型別

bad<-new("person",name="bad",age="abc")

# 設定age的非負檢查

setvalidity("person",function(object) )

# 修傳入小於0的年齡

bad2<-new("person",name="bad",age=-1)

2.6 從乙個已經例項化的物件中建立新物件

s4物件,還支援從乙個已經例項化的物件中建立新物件,建立時可以覆蓋舊物件的值

setclass("person",slots=list(name="character",age="numeric"))

# 建立乙個物件例項n1

n1<-new("person",name="n1",age=19);n1

# 從例項n1中,建立例項n2,並修改name的屬性值

n2<-initialize(n1,name="n2");n2

3 訪問物件的屬性

在s3物件中,一般我使用$來訪問乙個物件的屬性,但在s4物件中,我們只能使用@來訪問乙個物件的屬性

setclass("person",slots=list(name="character",age="numeric"))

a<-new("person",name="a")

# 訪問s4物件的屬性

a@name

slot(a, "name")

# 錯誤的屬性訪問

a$name

a[1]

a[1]

4 s4的泛型函式

s4的泛型函式實現有別於s3的實現,s4分離了方法的定義和實現,如在其他語言中我們常說的介面和實現分離。通過setgeneric()來定義介面,通過setmethod()來定義現實類。這樣可以讓s4物件系統,更符合物件導向的特徵。

普通函式的定義和呼叫

work<-function(x) cat(x, "is working")

work('conan')

# 定義person物件

setclass("person",slots=list(name="character",age="numeric"))

# 定義泛型函式work,即介面

setgeneric("work",function(object) standardgeneric("work"))

# 定義work的現實,並指定引數型別為person物件

setmethod("work", signature(object = "person"), function(object) cat(object@name , "is working") )

# 建立乙個person物件a

a<-new("person",name="conan",age=16)

# 把物件a傳入work函式

work(a)

conan is working

通過s4物件系統,把原來的函式定義和呼叫2步,為成了4步進行:

(1)定義資料物件型別

(2)定義介面函式

(3)定義實現函式

(4)把資料物件以引數傳入到介面函式,執行實現函式

通過s4物件系統,是乙個結構化的,完整的物件導向實現。

5 檢視s4物件的函式

當我們使用s4物件進行物件導向封裝後,我們還需要能檢視到s4物件的定義和函式定義。

還以上節中person和work的例子

# 檢查work的型別

ftype(work)

# 直接檢視work函式

work

# 檢視work函式的現實定義

showmethods(work)

# 檢視person物件的work函式現實

getmethod("work", "person")

selectmethod("work", "person")

# 檢查person物件有沒有work函式

existsmethod("work", "person")

hasmethod("work", "person")

R語言判斷資料型別及特殊值

size large r中獲取資料型別資訊的一些有用函式 r語言的物件 類 很多,雖然我們不可能一一去詳細學習,但接觸到一類新資料時我們需要了解一些基本資訊才能進行進一步的操作。r提供了一些非常有用的方法 函式 getclass 函式我們前面已經見過了,它的引數是表示類的字串。class 可獲取乙個...

R語言資料型別轉化

r語言資料型別轉化 有時候,對於一些問題,需要進行資料型別之間的轉換。r提供了基本型別轉換函式以解決資料型別轉換這個問題。常用的基本資料型別轉換函式彙總如下。函式一 as.character x 函式二 as.complex x 函式三 as.numeric x 或者as.double x 函式四 ...

特殊資料型別

1 結構型別 類似於c 中的struct 例如 patient.name xy patient.billing 130.12 patient.test 78 23 34 34 234 234 433 567 patient patient name xy billing 130.1200 test ...