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


R setAs 將對象強製為類的方法


R語言 setAs 位於 methods 包(package)。

說明

setAs 的調用定義了一種將 from 類的對象強製為 to 類的方法。然後,這些方法將通過對 as 類的對象的調用來使用 from ,包括替換部分對象的調用。

通過為函數 coerce 定義方法,可以間接實現此目的。 coerce 函數不能直接調用,方法選擇僅在第一個參數上使用類繼承。

用法

setAs(from, to, def, replace, where = topenv(parent.frame()))

參數

from, to

強製方法 defreplace 之間執行強製的類。

def

一個參數的函數。它將從類 from 獲取一個對象,並且最好返回類 to 的對象。約定參數的名稱是 from ;如果使用另一個參數名稱,setAs 將嘗試替換 from

replace

如果提供,當 as 用於賦值左側時用作替換方法的函數。應該是兩個參數的函數 from, value ,盡管如果參數不同,setAs 將嘗試替換。

其餘參數將不會在標準應用程序中使用。

where

存儲結果方法的位置或環境。在包中定義方法時不要使用此參數。在正常情況下,隻應使用默認值(包的名稱空間)。

繼承與強製

一個類的對象可以自動或通過顯式調用 as 函數轉換為另一類的對象。自動轉換是特殊的,它來自一類對象的設計者,斷言該類擴展了另一個類。最常見的情況是,在 contains= 參數中向 setClass 提供一個或多個類名,在這種情況下,新類擴展了每個早期類(用通常的術語來說,早期類是新類的超類)類,並且它是每個類的子類)。

這種形式的繼承稱為簡單的繼承於R.看setClass了解詳情。繼承也可以通過調用顯式定義setIs。這兩個版本對強製方法的含義略有不同。簡單繼承意味著繼承的槽在子類和超類中的行為相同。每當兩個類通過簡單繼承相關時,都會定義相應的強製方法,以供直接和替換使用as。在簡單繼承的情況下,這些方法執行明顯的計算:它們提取或替換對象中與超類定義中的槽相對應的槽。

隱式定義的強製方法可以通過調用 setAs 來覆蓋;但請注意,隱式方法是為每個 subclass-superclass 對定義的,因此您必須顯式重寫其中每一個,而不是依賴繼承。

當通過調用 setIs 定義繼承時,強製方法是顯式提供的,而不是自動生成的。繼承將適用(適用於 from 參數,如下節所述)。您還可以通過 setAs 為非繼承關係提供方法,現在這些也可以被繼承。

有關簡單繼承和顯式繼承之間區別的更多信息,請參閱setIs

函數'as'和'setAs'如何工作

函數 asobject 轉換為類 Class 的對象。在此過程中,它使用 S4 類和方法應用“coerce method”,但方式有些特殊。強製方法是函數 coerce 的方法,或者在替換情況下是函數 `coerce<-` 的方法。這些函數在方法簽名中有兩個參數, fromto ,對應於對象的類和所需的強製類。這些函數不得直接調用,而是用於存儲方法表,以便直接使用 as 和進行替換。在本節中,我們將說明直接情況,但除非另有說明,替換情況的工作方式相同,使用 `coerce<-`replace 參數到 setAs ,而不是 coercedef 參數。

假設 object 還不是所需的類,as 首先在函數 coerce 的方法表中查找簽名 c(from = class(object), to = Class) 的方法,方法選擇的初始查找方式相同。準確地說,這意味著直接方法和繼承方法的表,但在這種情況下專門使用了繼承(見下文)。

如果沒有找到方法,as 會尋找一個方法。首先,如果 Classclass(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= 參數無關緊要。

setAsreplace 參數提供了 `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-devel大神的英文原創作品 Methods for Coercing an Object to a Class。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。