轉(zhuǎn)載自:R語(yǔ)言教程
面向?qū)ο蟮木幊虃?cè)重于數(shù)據(jù)和對(duì)象,而不是程序。面向?qū)ο蟮哪P陀兄谖覀儗?duì)現(xiàn)實(shí)生活中的對(duì)象進(jìn)行建模。為了在數(shù)據(jù)科學(xué)領(lǐng)域出類(lèi)拔萃,掌握面向?qū)ο蟮木幊谈拍詈苤匾C總€(gè)程序都有特殊類(lèi)型的類(lèi)。在本教程中,將重點(diǎn)討論R語(yǔ)言中的S3和S4類(lèi)、泛型函數(shù)、類(lèi)之間的繼承性和多態(tài)性。在本教程中,我們將討論R中面向?qū)ο蟮木幊谈拍?/p>
R中的面向?qū)ο缶幊?/h2>
面向?qū)ο缶幊淌且环N圍繞著類(lèi)和對(duì)象而不是函數(shù)的編程模式。在R中,我們還可以創(chuàng)建兩種特殊類(lèi)型的類(lèi),即S3和S4。OOPS的概念使我們能夠創(chuàng)建模塊化的作品,作為大型系統(tǒng)的構(gòu)建塊。S3和S4是面向?qū)ο缶幊讨械膬蓚€(gè)重要類(lèi)。S3類(lèi)允許重載任何函數(shù)。S4類(lèi)與S3略有不同,它包含用于定義方法和泛型的輔助函數(shù)。
R中的類(lèi)和對(duì)象
類(lèi)是一種用戶(hù)定義的數(shù)據(jù)類(lèi)型,對(duì)象就是從這種類(lèi)型中創(chuàng)建的。它們有時(shí)也被稱(chēng)為藍(lán)圖。這是因?yàn)樗鼈兌x了對(duì)象的結(jié)構(gòu)。一個(gè)類(lèi)是一個(gè)被動(dòng)的實(shí)體,而一個(gè)對(duì)象是一個(gè)主動(dòng)的實(shí)體。
R認(rèn)為所有事物都是對(duì)象。一個(gè)對(duì)象是一個(gè)類(lèi)的單一實(shí)例。R為我們提供了一個(gè)class()函數(shù),它既可以用來(lái)定義一個(gè)函數(shù)的類(lèi),也可以為一個(gè)已經(jīng)定義的對(duì)象獲取類(lèi)的信息。
R中的類(lèi)是以矢量形式存在的。由于這個(gè)屬性,對(duì)象可以繼承許多類(lèi),而且我們還可以指定繼承的順序,即使是復(fù)雜的類(lèi)。
示例
Names <-c("Bhuwanesh","Jai", "Piyush", "Anil", "Hitesh", "Naveen")
print(class(Names))
輸出
[1] "character"
由于該類(lèi)元素屬于字符類(lèi),因此顯示了 “字符”。
示例
現(xiàn)在讓我們看看如何追加一個(gè)對(duì)象的類(lèi)別–
Names <-c("Bhuwanesh", "Jai", "Piyush", "Anil", "Hitesh", "Naveen")
class(Names)<-append(class(Names), "boys")
print(class(Names))
輸出
[1] "character" "boys"
正如你在輸出中看到的,我們已經(jīng)附加了向量的類(lèi)別。
R中的類(lèi)
S3 Class
S3類(lèi)是R中最常用的類(lèi)之一。這個(gè)類(lèi)很容易實(shí)現(xiàn),許多預(yù)定義的類(lèi)都是這種類(lèi)型。
一個(gè)S3類(lèi)的對(duì)象是一個(gè)列表,該列表具有用一些名稱(chēng)分配的類(lèi)屬性。列表的組成部分由對(duì)象的成員變量表示。
創(chuàng)建S3類(lèi)
我們可以通過(guò)以下步驟創(chuàng)建一個(gè)S3對(duì)象—-。
- 編制一份具有所需組件價(jià)值的清單。
-
然后,我們可以使用class()函數(shù)輕松地創(chuàng)建一個(gè)類(lèi),同時(shí)給這個(gè)類(lèi)附加一個(gè)名字。
示例
# Creating list
myList <- list(Name ="Bhuwanesh", Enrollment_Number = 3496303119,
Course = "Btech", Branch = "Information Technology")
# class
class(myList) <- "University"
myList
輸出
$Name
[1] "Bhuwanesh"
$Enrollment_Number
[1] 3496303119
$Course
[1] "Btech"
$Branch
[1] "Information Technology"
attr(,"class")
[1] "University"
通用功能
我們?cè)赗中擁有通用函數(shù),可以達(dá)到多態(tài)性的目的(就像許多其他哎呀語(yǔ)言:C++,Java等)。
多態(tài)性?是指形式。它指出,一條信息可以有一個(gè)以上的不同形式,或者它可以為不同的目的服務(wù)。
例如,在R語(yǔ)言中,summary()函數(shù)是一個(gè)由許多summary()函數(shù)組成的集合,可以用于不同的數(shù)據(jù)類(lèi)型和數(shù)據(jù)結(jié)構(gòu)。這類(lèi)函數(shù)根據(jù)作為參數(shù)傳遞的對(duì)象的類(lèi)型,調(diào)用一個(gè)適當(dāng)?shù)暮瘮?shù)。我們可以使用methods()函數(shù)看到summary()函數(shù)的各種實(shí)現(xiàn)。
methods(summary)
我們可以在R中創(chuàng)建我們自己的通用函數(shù)。讓我們考慮以下程序,它創(chuàng)建了一個(gè)名為 “myList “的列表,然后從中創(chuàng)建一個(gè)類(lèi)。
示例
現(xiàn)在我們使用summary()函數(shù)來(lái)顯示這個(gè)類(lèi)的摘要 –
# Create a list
myList <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
# Define the class
class(myList) <- "University"
# Display the summary
print(summary(myList))
輸出
Length Class Mode
Name 1 -none- character
Enrollment_Number 1 -none- numeric
Course 1 -none- character
Branch 1 -none- character
屬性
屬性是與一個(gè)對(duì)象相關(guān)的額外信息,用于處理該對(duì)象。我們可以使用 attributes() 函數(shù)來(lái)獲取一個(gè)對(duì)象的屬性。
示例
# Create a list
myList <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
# Define a class
class(myList) <- "University"
# Display attributes
print(attributes(myList))
輸出
$names
[1] "Name" "Enrollment_Number" "Course"
[4] "Branch"
$class
[1] "University"
我們也可以在attr()函數(shù)的幫助下將我們自己的屬性應(yīng)用到一個(gè)對(duì)象上,讓我們考慮下面的例子來(lái)說(shuō)明這個(gè)函數(shù)的工作原理
示例
# Create a list
myList <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information?Technology")
# Define class
class(myList) <-"University"
# Defining custom attributes
attr(myList,"Grade")<-c('A')
# Display attribute
print(attributes(myList))
輸出
$names
[1] "Name" "Enrollment_Number" "Course"
[4] "Branch"
$class
[1] "University"
$Grade
[1] "A"
S3類(lèi)中的繼承性
繼承性?是面向?qū)ο缶幊陶Z(yǔ)言的最重要支柱之一,它允許一個(gè)類(lèi)繼承另一個(gè)類(lèi)的屬性。這一特點(diǎn)帶來(lái)了代碼可重用性等好處。
S3類(lèi)并不包含任何特定的定義模式。
示例
# Create a list
myList1 <- list(Name ="Bhuwanesh", Enrollment_Number = 3496303119,
Course = "Btech", Branch = "Information Technology")
# Define the class
class(myList1) <- "University"
# Create a list
myList2 <- list(College_Rank = 14, State = 'Uttarakhand')
# Define the inheritance relation
class(myList2) <- c("College", "University")
print(myList2)
輸出
$College_Rank
[1] 14
$State
[1] "Uttarakhand"
attr(,"class")
[1] "College" "University"
正如你在輸出中看到的,”學(xué)院 “類(lèi)繼承了 “大學(xué) “類(lèi)。
現(xiàn)在讓我們嘗試使用基類(lèi) “大學(xué) “的一個(gè)對(duì)象來(lái)訪(fǎng)問(wèn)和修改基類(lèi) “大學(xué) “的組件-
示例
# Create a list
myList1 <- list(Name ="Bhuwanesh", Enrollment_Number = 3496303119,
Course = "Btech", Branch = "Information Technology")
# Define a class
class(myList1) <- "University"
myList2 <- list(College_Rank = 14, State = 'Uttarakhand')
class(myList2) <- c("College", "University")
# Define the attribute
myList2$Name = "Harshit"
print(myList2)
輸出
$College_Rank
[1] 14
$State
[1] "Uttarakhand"
$Name
[1] "Harshit"
attr(,"class")
[1] "College" "University"
你可以在輸出中看到,”姓名 “屬性已被修改為 “Harshit”。
S4 Class
R允許我們使用另一種特殊的類(lèi),稱(chēng)為 “S4 “類(lèi)。這個(gè)類(lèi)包含預(yù)定義的定義。這個(gè)類(lèi)包含定義方法和泛型的函數(shù)。這個(gè)類(lèi)還為我們提供了定義泛型和方法的輔助函數(shù)。
setClass()函數(shù)創(chuàng)建了一個(gè)S4類(lèi)。R為我們提供了new()函數(shù),用來(lái)創(chuàng)建一個(gè)S4類(lèi)的對(duì)象—-。
示例
# Define a list
myList1 <- list(Name ="Bhuwanesh",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
# Set the class
setClass("University", slots = list(Name ="character",
Enrollment_Number = "numeric",
Course = "character",
Branch = "character"))
# Define the object
myObject <- new("University",
Name = "Bhuwanesh Nainwal",
Enrollment_Number = 3496303119,
Course = "Btech",
Branch = "Information Technology")
print(myObject)
輸出
An object of class "University"
Slot "Name":
[1] "Bhuwanesh Nainwal"
Slot "Enrollment_Number":
[1] 3496303119
Slot "Course":
[1] "Btech"
Slot "Branch":
[1] "Information Technology"
S4類(lèi)中的繼承性
繼承是面向?qū)ο缶幊陶Z(yǔ)言的最重要支柱之一,它允許一個(gè)類(lèi)繼承另一個(gè)類(lèi)的屬性。這一特性帶來(lái)了代碼可重用性等好處。
S4類(lèi)包含了一個(gè)適當(dāng)?shù)哪J絹?lái)定義它。派生類(lèi)有足夠的能力來(lái)繼承基類(lèi)的屬性和方法。為了達(dá)到這個(gè)目的,我們可以文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-807382.html
示例
# Set class
setClass("University",
slots = list(Name = "character",
Enrollment_Number = "numeric",
Branch = "character")
)
# Set methods
setMethod("show", "University",
function(object){
cat(object@Name, "
")
cat(object@Enrollment_Number, "
")
cat(object@Branch, "
")
}
)
# Inherit
setClass("College",
slots = list(Grade= "character"),
contains = "University"
)
# Define the object
object <- new("College", Name = "Bhuwanesh Nainwal",
Branch="Information Technology",
Enrollment_Number = 3496303119)
# Display the object
show(object)
輸出
Bhuwanesh Nainwal
3496303119
Information Technology
結(jié)論
在這篇文章中,我們討論了與R相關(guān)的面向?qū)ο蟮木幊谈拍?,并?duì)S3和S4等類(lèi)進(jìn)行了詳細(xì)的討論。我們相信,這個(gè)教程肯定會(huì)增強(qiáng)你在數(shù)據(jù)科學(xué)領(lǐng)域的知識(shí)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-807382.html
到了這里,關(guān)于【轉(zhuǎn)載】R語(yǔ)言 面向?qū)ο缶幊痰奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!