當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R class 對象類


R語言 class 位於 base 包(package)。

說明

R擁有簡單的通用函數機製,可用於麵向對象的編程風格。方法調度是根據泛型函數的第一個參數的類進行的。

用法

class(x)
class(x) <- value
unclass(x)
inherits(x, what, which = FALSE)
nameOfClass(x)
isa(x, what)

oldClass(x)
oldClass(x) <- value
.class2(x)

參數

x

a R對象

what , value

命名類的字符向量。 value 也可以是 NULLwhat 也可以是具有 nameOfClass() 方法的非字符 R 對象。

which

影響返回值的邏輯:參見“詳細信息”。

細節

在這裏,我們說明所謂的“S3”類(和方法)。對於 “S4” 類(和方法),請參閱下麵的“正式類”。

許多R對象有一個classattribute,一個字符向量,給出對象所屬類的名稱繼承。 (函數oldClassoldClass<-獲取和設置屬性,也可以直接完成。)

如果對象沒有類屬性,則它具有隱式類,特別是 "matrix""array""function""numeric"typeof(x) 的結果(類似於 mode(x) ),但是對於類型 "language"mode "call" ,其中對應函數 call 存在以下額外類: if , while , for , = , <- , ( , { , call

請注意,對於對象x隱式(或 S4)類的,當(S3)泛型函數foo(x)被調用時,方法調度可能使用比返回的更多的類class(x),例如,對於數字矩陣,foo.numeric()方法可適用。準確完整character類的向量UseMethod()使用,可作為.class2(x)自從R版本 4.0.0。 (當考慮 S3 調度時,這也適用於 S4 對象,請參見下文。)

請注意,出於教學、診斷或調試以外的其他原因使用 .class2() 可能是一種誤用,而不是明智之舉。

NULL 對象(隱式類 "NULL" )不能具有屬性(因此沒有 class 屬性),並且嘗試分配類是錯誤的。

當通用函數 fun 應用於具有類屬性 c("first", "second") 的對象時,係統會搜索名為 fun.first 的函數,如果找到,則將其應用於該對象。如果沒有找到這樣的函數,則會嘗試名為fun.second 的函數。如果沒有類名產生合適的函數,則使用函數fun.default(如果存在)。如果沒有class屬性,則嘗試隱式類,然後使用默認方法。

函數 class 打印對象繼承的類名稱向量。相應地,class<- 設置對象繼承的類。分配空字符向量或 NULL 會刪除類屬性,就像 oldClass<- 或直接屬性設置一樣。雖然顯式分配 NULL 來刪除該類更清楚,但在例如 class(x) <- setdiff(class(x), "ts") 中使用空向量更自然。

unclass 返回其參數(的副本),並刪除其類屬性。 (對於無法複製的對象,即環境和外部指針,不允許這樣做。)

inherits 指示其第一個參數是否繼承自 what 參數中指定的任何類。如果whichTRUE,則返回與what 長度相同的整數向量。每個元素表示class(x)中與what的元素匹配的位置;零表示不匹配。如果 whichFALSE,則 TRUEinherits 返回(如果 what 中的任何名稱與任何 class 匹配)。

nameOfClass 是 S3 泛型。 inherits 調用它來獲取 what 的類名,從而允許 what 為字符向量以外的值。 nameOfClass 方法預計返回長度為 1 的字符向量。

如果 x 是 S4 對象,則 isa 使用 is 測試 x 是否為 what 中給出的類的對象。否則給出 TRUE 當且僅當 class(x) 的所有元素都包含在 what 中。

inheritsisa 之外的所有函數都是primitive 函數。

正式課程

默認情況下附加的包 methods 中提供了正式類的附加機製,昵稱“S4”。對於具有正式類的對象,其名稱由 class 作為長度為 1 的字符向量返回,並且方法分派可以在多個參數上進行,而不僅僅是第一個參數。但是,S3 方法選擇嘗試將 S4 類中的對象視為具有適當的 S3 類屬性,就像 inherits 一樣。因此,可以為S4類定義S3方法。有關 S4 方法的基本信息以及這些方法與 S3 方法之間的關係,請參閱“Introduction”和“Methods_for_S3”幫助頁麵。

該函數的替換版本將類設置為提供的值。對於具有正式定義的類,強烈反對以這種方式直接替換類。表達式 as(object, value) 是將對象強製為特定類的方法。

正式類的 inherits 的類似物是 is 。這兩個函數的行為一致,但有一個異常:S4 類可以通過顯式測試進行條件繼承。在這種情況下,is 將測試條件,但 inherits 忽略所有條件超類。

注意

職能oldClassoldClass<-其行為方式與 S-PLUS 5/6 中這些名稱的函數相同,R UseMethod調度返回的類class(對於一些插值類:請參閱鏈接)而不是oldClass.然而,base groupGenerics 調度oldClass為了效率,以及內部通用s 僅調度對象is.object是真的。

例子

x <- 10
class(x) # "numeric"
oldClass(x) # NULL
inherits(x, "a") #FALSE
class(x) <- c("a", "b")
inherits(x,"a") #TRUE
inherits(x, "a", TRUE) # 1
inherits(x, c("a", "b", "c"), TRUE) # 1 2 0

class( quote(pi) )           # "name"
## regular calls
class( quote(sin(pi*x)) )    # "call"
## special calls
class( quote(x <- 1) )       # "<-"
class( quote((1 < 2)) )      # "("
class( quote( if(8<3) pi ) ) # "if"

.class2(pi)               # "double" "numeric"
.class2(matrix(1:6, 2,3)) # "matrix" "array" "integer" "numeric"

也可以看看

UseMethodNextMethod、‘group generic’、‘internal generic

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Object Classes。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。