S3Part
位於 methods
包(package)。 說明
常規 (S4) 類可能包含 S3 類,如果該類已注冊(通過調用 setOldClass
)。此處說明的函數提供有關包含的 S3 類的信息。請參閱“函數”部分。
在現代R,使用 S4 類的對象進行編程時通常不需要這些函數。標準計算按預期工作,包括 S4 和 S3 的方法選擇。要將對象強製為其包含的 S3 類,請使用以下任一表達式:
as(object, S3Class); as(object, "S3")
其中 S3Class
計算結果為所包含類的名稱。這些返回的對象略有不同,在極少數情況下可能需要區分。請參閱“包含的 S3 對象”部分。
用法
S3Part(object, strictS3 = FALSE, S3Class)
S3Class(object)
isXS3Class(classDef)
slotsFromS3(object)
## the replacement versions of the functions are not recommended
## Create a new object from the class or use the replacement version of as().
S3Part(object, strictS3 = FALSE, needClass = ) <- value
S3Class(object) <- value
參數
object |
來自擴展已注冊 S3 類的某個類的對象,或者基本向量、矩陣或數組對象類型。 對於大多數函數,還可以提供 S3 對象,解釋為它是它自己的 S3 部分。 |
strictS3 |
如果是 |
S3Class |
要存儲為對象中的 S3 類槽的 |
classDef |
類定義對象,由 其餘參數僅適用於替換版本,不推薦使用。 |
needClass |
要求替換值是此類或其子類。 |
value |
對於 對於 |
職能
S3Part
:將 contains=
參數中出現的 S3 類中的對象返回給 setClass
。
如果使用 strictS3 = TRUE
調用,S3Part()
將通過消除所有正式定義的槽並關閉對象的 S4 位來構造底層 S3 對象。對於strictS3 = FALSE
,返回的對象來自相應的 S4 類。為了一致性和通用性,S3Part()
也適用於擴展基本向量、矩陣和數組類的類。
對於嚴格情況,調用等效於將對象強製為類"S3"
,或者對於非嚴格情況,將對象強製為特定的 S3 類。 as()
調用通常更容易讓讀者理解。
S3Class
:如果該類具有相應的 .S3Class
槽,則返回存儲在對象中的 S3 類的字符向量。目前,該函數默認為class
。
isXS3Class
:根據ClassDef
定義的類是否擴展了S3類(具體來說,是否具有保存S3類的槽),返回TRUE
或FALSE
。
slotsFromS3
:返回相關槽類的列表,或任何其他對象的空列表。
函數 slotsFromS3()
是內部使用的通用函數,用於訪問與對象的 S3 部分關聯的槽。當使用 S4Class
參數調用 setOldClass
時,會自動創建此函數的方法。通常,隻有一個 S3 槽,包含 S3 類,但 S4Class
參數可能會提供額外的槽,以防 S3 類具有一些可用作正式 S4 槽的保證屬性。請參閱 setOldClass
文檔中的相應部分。
包含的 S3 對象
注冊 S3 類定義 S4 類。該類的對象在內容上與 S3 類的對象基本相同,但有兩個差異。 class()
返回的值始終是 S4 對象的單個字符串,並且 isS4()
在這兩種情況下將返回 TRUE
或 FALSE
。請參閱下麵的示例。某些 S3 代碼幾乎不可能與 S4 對象一起工作;如果是這樣,請使用 as(x, "S3")
。
擴展 S3 類的類中的對象將具有一些基本類型和可能的一些屬性。對於具有等效 S4 定義的 S3 類(例如 "data.frame"
),擴展 S4 類將具有數據部分和槽。對於其他 S3 類(例如, "lm"
),擴展 S4 類中的對象將是某種基本類型,幾乎總是向量類型(例如, "list"
表示 "lm"
),但數據部分不會具有一個正式的定義。
通過調用 setOldClass
注冊 S3 類會創建一個同名的類,並使用槽 ".S3Class"
來保存相應的類字符串 S3 向量。擴展此類的新 S4 類也具有相同的槽,設置為所包含的 S3 對象的 S3 類,該對象可能是注冊類的 (S3) 子類。例如,S4 類可能包含 S3 類 "lm"
,但該類中的對象可能包含類 "mlm"
中的對象,如下麵的 "xlm"
示例所示。
R對於 S3 類的處理方式有些隨意:"ts"
是,但是"matrix"
和"array"
不是。對於擴展這些類的類,假設它們包含 S3 類是不正確的,並且會導致一些混亂 - 通常不會造成災難性的後果,但更好的策略是堅持顯式的 “class”。因此as(x, "matrix")
而不是as(x, "S3")
或者S3Part(x)
.
S3 和 S4 對象:轉換機製
對象位於R有一個內部位,指示是否將該對象視為來自 S4 類。該位通過測試isS4
並可以通過以下方式打開或關閉asS4
。然而,後一個函數不進行檢查或解釋;僅當您非常確定每個細節都已正確處理時才應使用它。
作為更友好的替代方案,定義了用於強製虛擬類 "S3"
和 "S4"
的方法。表達式as(object, "S3")
和as(object, "S4")
分別返回S3 和S4 對象。此外,他們嘗試以有效的方式進行轉換,並在強製轉換為 S4 時檢查有效性。
表達式 as(object, "S3")
可以通過兩種方式使用。對於來自已注冊 S3 類之一的對象,表達式將確保類屬性是 class(object)
隱含的完整 multi-string S3 類。如果注冊的類具有已知的屬性/槽,也將提供這些屬性/槽。
as(object, "S3")
的另一個用途是獲取 S4 對象並將其轉換為具有相應屬性的 S3 對象。這僅對具有數據部分的 S4 類有意義。如果您想在不調用 S4 方法的情況下操作對象,這種轉換通常是最安全的方式。
表達式 as(object, "S4")
將使用對象中的屬性從 class(object)
的 S4 定義創建對象。這是通過 S3 計算創建 S4 對象的部分定義版本的通用機製(與使用相應參數調用 new
沒有太大區別,但即使 S4 對象具有具有不同參數的初始化方法,也可以以這種形式使用)。
例子
## an "mlm" object, regressing two variables on two others
sepal <- as.matrix(datasets::iris[,c("Sepal.Width", "Sepal.Length")])
fit <- lm(sepal ~ Petal.Length + Petal.Width + Species, data = datasets::iris)
class(fit) # S3 class: "mlm", "lm"
## a class that contains "mlm"
myReg <- setClass("myReg", slots = c(title = "character"), contains = "mlm")
fit2 <- myReg(fit, title = "Sepal Regression for iris data")
fit2 # shows the inherited "mlm" object and the title
identical(S3Part(fit2), as(fit2, "mlm"))
class(as(fit2, "mlm")) # the S4 class, "mlm"
class(as(fit2, "S3")) # the S3 class, c("mlm", "lm")
## An object may contain an S3 class from a subclass of that declared:
xlm <- setClass("xlm", slots = c(eps = "numeric"), contains = "lm")
xfit <- xlm(fit, eps = .Machine$double.eps)
xfit@.S3Class # c("mlm", lm")
參考
Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10, particularly Section 10.8)
也可以看看
相關用法
- R StructureClasses 基本結構對應的類
- R S4groupGeneric S4組通用函數
- R as 強製對象屬於某個類
- R language-class 表示未評估語言對象的類
- R className 類名包含對應的包
- R BasicClasses 基本數據類型對應的類
- R callGeneric 從方法調用當前通用函數
- R findClass 查找類定義
- R setOldClass 注冊舊式 (S3) 類和繼承
- R ReferenceClasses 具有按引用處理的字段的對象(OOP 樣式)
- R MethodsList 方法列表對象
- R setGroupGeneric 創建函數的組通用版本
- R showMethods 顯示指定函數或類的所有方法
- R getMethod 獲取或測試方法的定義
- R slot 正式類對象中的槽
- R methodUtilities 用於方法和 S-Plus 兼容性的實用函數
- R getClass 獲取類定義
- R evalSource 使用源文件中的函數定義,無需重新安裝包
- R is 對象是來自類嗎?
- R isSealedMethod 檢查密封方法或類
- R cbind2 按列或行組合兩個對象
- R GenericFunctions 管理通用函數的工具
- R dotsMethods 在方法簽名中使用...
- R nonStructure-class 基本類型的非結構 S4 類
- R selectSuperClasses 類的超類(特定類型)
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 S4 Classes that Contain S3 Classes。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。