setAs
位於 methods
包(package)。 說明
對 setAs
的調用定義了一種將 from
類的對象強製為 to
類的方法。然後,這些方法將通過對 as
類的對象的調用來使用 from
,包括替換部分對象的調用。
通過為函數 coerce
定義方法,可以間接實現此目的。 coerce
函數不能直接調用,方法選擇僅在第一個參數上使用類繼承。
用法
setAs(from, to, def, replace, where = topenv(parent.frame()))
參數
from, to |
強製方法 |
def |
一個參數的函數。它將從類 |
replace |
如果提供,當 其餘參數將不會在標準應用程序中使用。 |
where |
存儲結果方法的位置或環境。在包中定義方法時不要使用此參數。在正常情況下,隻應使用默認值(包的名稱空間)。 |
繼承與強製
一個類的對象可以自動或通過顯式調用 as
函數轉換為另一類的對象。自動轉換是特殊的,它來自一類對象的設計者,斷言該類擴展了另一個類。最常見的情況是,在 contains=
參數中向 setClass
提供一個或多個類名,在這種情況下,新類擴展了每個早期類(用通常的術語來說,早期類是新類的超類)類,並且它是每個類的子類)。
這種形式的繼承稱為簡單的繼承於R.看setClass
了解詳情。繼承也可以通過調用顯式定義setIs
。這兩個版本對強製方法的含義略有不同。簡單繼承意味著繼承的槽在子類和超類中的行為相同。每當兩個類通過簡單繼承相關時,都會定義相應的強製方法,以供直接和替換使用as
。在簡單繼承的情況下,這些方法執行明顯的計算:它們提取或替換對象中與超類定義中的槽相對應的槽。
隱式定義的強製方法可以通過調用 setAs
來覆蓋;但請注意,隱式方法是為每個 subclass-superclass 對定義的,因此您必須顯式重寫其中每一個,而不是依賴繼承。
當通過調用 setIs
定義繼承時,強製方法是顯式提供的,而不是自動生成的。繼承將適用(適用於 from
參數,如下節所述)。您還可以通過 setAs
為非繼承關係提供方法,現在這些也可以被繼承。
有關簡單繼承和顯式繼承之間區別的更多信息,請參閱setIs
。
函數'as'和'setAs'如何工作
函數 as
將 object
轉換為類 Class
的對象。在此過程中,它使用 S4 類和方法應用“coerce method”,但方式有些特殊。強製方法是函數 coerce
的方法,或者在替換情況下是函數 `coerce<-`
的方法。這些函數在方法簽名中有兩個參數, from
和 to
,對應於對象的類和所需的強製類。這些函數不得直接調用,而是用於存儲方法表,以便直接使用 as
和進行替換。在本節中,我們將說明直接情況,但除非另有說明,替換情況的工作方式相同,使用 `coerce<-`
和 replace
參數到 setAs
,而不是 coerce
和 def
參數。
假設 object
還不是所需的類,as
首先在函數 coerce
的方法表中查找簽名 c(from = class(object), to =
Class)
的方法,方法選擇的初始查找方式相同。準確地說,這意味著直接方法和繼承方法的表,但在這種情況下專門使用了繼承(見下文)。
如果沒有找到方法,as
會尋找一個方法。首先,如果 Class
或 class(object)
是另一個的超類,則類定義將包含構造強製方法所需的信息。在子類包含超類(即具有其所有槽)的通常情況下,該方法是通過提取或替換繼承的槽來構造的。非簡單擴展(調用 setIs
的結果)通常包含顯式方法,但可能不用於替換。
如果沒有子類/超類關係提供方法,as
會查找繼承的方法,但僅對參數 from
應用繼承,而不是對參數 to
應用繼承(如果您考慮一下,您可能會同意您不希望結果來自指定的 Class
之外的某個類)。因此, selectMethod("coerce", sig, useInherited= c(from=TRUE, to= FALSE))
複製 as()
使用的方法選擇。
幾乎在所有情況下,以這種方式找到的方法都將緩存在強製方法表中(例外是與測試的子類關係,這是合法的,但不鼓勵這樣做)。因此,應僅在第一次出現從 class(object)
到 Class
的強製時進行詳細計算。
請注意,coerce
不是標準通用函數。它不適合直接調用。為了防止意外緩存無效的繼承方法,調用將路由到對 as
的等效調用,並發出警告。此外,為此函數調用selectMethod
可能並不代表as
將選擇的方法。僅當此會話中先前發生過對 as
的相應調用時,您才可以信任結果。
以此解釋為背景,函數 setAs
進行了相當明顯的計算:它為具有簽名 c(from, to)
的函數 coerce
構造並設置了一個方法,使用 def
參數來定義方法的主體。作為 def
提供的函數可以有一個參數(解釋為要強製的對象)或兩個參數(from
對象和 to
類)。無論哪種方式,setAs
都會構造一個包含兩個參數的函數,第二個參數默認為 to
類的名稱。該方法將從 as
調用,對象作為 from
參數,沒有 to
參數,該參數的默認值是預期的 to
類的名稱,因此該方法可以在消息。
as
函數的直接版本還有一個 strict=
參數,默認為 TRUE
。在評估其他函數的方法期間調用會將此參數設置為 FALSE
。當被強製的對象來自 to
類的簡單子類時,這種區別是相關的;如果在這種情況下為 strict=FALSE
,則無需執行任何操作。對於大多數 user-written 強製方法,當兩個類沒有子類/超類時,strict=
參數無關緊要。
setAs
的 replace
參數提供了 `coerce<-`
的方法。與所有替換方法一樣,該方法的最後一個參數對於賦值右側的對象必須具有名稱 value
。與 coerce
方法一樣,前兩個參數是 from, to
;替換情況沒有 strict=
選項。
函數coerce
作為此類方法的存儲庫而存在,由as
函數如上所述進行選擇。實際上,通過在 to
參數上使用繼承,使用 standardGeneric
分派方法可能會產生不正確的繼承方法;如前所述,這不是 as
使用的邏輯。為了防止選擇和緩存無效方法,對 coerce
的調用當前映射到對 as
的調用,並帶有警告消息。
基本強製方法
預定義方法用於將任何對象強製為一種基本數據類型。例如,as(x, "numeric")
使用現有的as.numeric
函數。這些內置方法可以通過 showMethods("coerce")
列出。
例子
## using the definition of class "track" from \link{setClass}
setAs("track", "numeric", function(from) from@y)
t1 <- new("track", x=1:20, y=(1:20)^2)
as(t1, "numeric")
## The next example shows:
## 1. A virtual class to define setAs for several classes at once.
## 2. as() using inherited information
setClass("ca", slots = c(a = "character", id = "numeric"))
setClass("cb", slots = c(b = "character", id = "numeric"))
setClass("id")
setIs("ca", "id")
setIs("cb", "id")
setAs("id", "numeric", function(from) from@id)
CA <- new("ca", a = "A", id = 1)
CB <- new("cb", b = "B", id = 2)
setAs("cb", "ca", function(from, to )new(to, a=from@b, id = from@id))
as(CB, "numeric")
參考
Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)
也可以看看
如果您考慮使用 try(as(x, cl))
,請考慮使用 canCoerce(x, cl)
。
相關用法
- R setOldClass 注冊舊式 (S3) 類和繼承
- R setGroupGeneric 創建函數的組通用版本
- R setClass 創建類定義
- R setGeneric 創建函數的通用版本
- R setMethod 創建並保存方法
- R setClassUnion 定義為其他類的聯合的類
- R setIs 顯式指定超類
- R setLoadActions 設置包加載操作
- R selectSuperClasses 類的超類(特定類型)
- R showMethods 顯示指定函數或類的所有方法
- R slot 正式類對象中的槽
- R show 顯示對象
- R as 強製對象屬於某個類
- R language-class 表示未評估語言對象的類
- R className 類名包含對應的包
- R BasicClasses 基本數據類型對應的類
- R callGeneric 從方法調用當前通用函數
- R findClass 查找類定義
- R ReferenceClasses 具有按引用處理的字段的對象(OOP 樣式)
- R MethodsList 方法列表對象
- R StructureClasses 基本結構對應的類
- R getMethod 獲取或測試方法的定義
- R S4groupGeneric S4組通用函數
- R methodUtilities 用於方法和 S-Plus 兼容性的實用函數
- R getClass 獲取類定義
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Methods for Coercing an Object to a Class。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。