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


R S3Part 包含 S3 類的 S4 類


R語言 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

如果是 TRUE ,則 S3Part 返回的值將是一個 S3 對象,並刪除所有 S4 插槽。否則,將始終返回一個 S4 對象;例如,從 setOldClass 創建的 S4 類作為 S3 類的代理,而不是底層的 S3 對象。

S3Class

要存儲為對象中的 S3 類槽的 character 向量。通常,默認情況下,保留 object 中的槽,但允許使用 S3 超類。

classDef

類定義對象,由 getClass 返回。

其餘參數僅適用於替換版本,不推薦使用。

needClass

要求替換值是此類或其子類。

value

對於 S3Part<- ,對象的 S3 部分的替換值。

對於 S3Class<- ,將在 S3 方法調度中用作 class(x) 代理的字符向量。

職能

S3Part :將 contains= 參數中出現的 S3 類中的對象返回給 setClass

如果使用 strictS3 = TRUE 調用,S3Part() 將通過消除所有正式定義的槽並關閉對象的 S4 位來構造底層 S3 對象。對於strictS3 = FALSE,返回的對象來自相應的 S4 類。為了一致性和通用性,S3Part() 也適用於擴展基本向量、矩陣和數組類的類。

對於嚴格情況,調用等效於將對象強製為類"S3",或者對於非嚴格情況,將對象強製為特定的 S3 類。 as() 調用通常更容易讓讀者理解。

S3Class :如果該類具有相應的 .S3Class 槽,則返回存儲在對象中的 S3 類的字符向量。目前,該函數默認為class

isXS3Class :根據ClassDef定義的類是否擴展了S3類(具體來說,是否具有保存S3類的槽),返回TRUEFALSE

slotsFromS3 :返回相關槽類的列表,或任何其他對象的空列表。

函數 slotsFromS3() 是內部使用的通用函數,用於訪問與對象的 S3 部分關聯的槽。當使用 S4Class 參數調用 setOldClass 時,會自動創建此函數的方法。通常,隻有一個 S3 槽,包含 S3 類,但 S4Class 參數可能會提供額外的槽,以防 S3 類具有一些可用作正式 S4 槽的保證屬性。請參閱 setOldClass 文檔中的相應部分。

包含的 S3 對象

注冊 S3 類定義 S4 類。該類的對象在內容上與 S3 類的對象基本相同,但有兩個差異。 class() 返回的值始終是 S4 對象的單個字符串,並且 isS4() 在這兩種情況下將返回 TRUEFALSE。請參閱下麵的示例。某些 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)

也可以看看

setOldClass

相關用法


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