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


R setClassUnion 定義為其他類的聯合的類


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

說明

一個類可以被定義為其他類的聯合;也就是說,作為一個虛擬類,定義為幾個其他類的超類。當我們想要允許提供多個類之一時,類聯合在方法簽名中或作為其他類中的槽非常有用。

用法

setClassUnion(name, members, where)
isClassUnion(Class)

參數

name

新聯合類的名稱。

members

應成為該聯合成員的類的名稱。

where

保存新類定義的位置。在從包的源代碼調用時,應省略將定義保存在包的命名空間中。

Class

類的名稱或定義。

細節

members 中的類必須在創建聯合之前定義。但是,可以稍後將成員添加到現有聯合,如下例所示。階級工會可以是其他階級工會的成員。

類聯合是創建其定義被密封的類的新超類的唯一方法。加載包時,所有包的命名空間都會被密封,從而保護類和其他定義不被另一個類或全局環境覆蓋。例如,嘗試為類 "numeric" 定義新超類的對 setIs 的調用將導致錯誤。

階級工會是個例外。示例中的類聯合 "maybeNumber" 將自身定義為 "numeric" 的新超類。從技術上講,它不會更改其他包的命名空間中的元數據對象,當然,類聯合的效果取決於加載它所屬的包。但本質上,階級工會足以證明豁免的合理性。

類聯合的不同行為之所以成為可能,是因為類聯合的類定義對象本身有一個特殊的類 "ClassUnionRepresentation" ,它是類 classRepresentation 的擴展。

例子

## a class for either numeric or logical data
setClassUnion("maybeNumber", c("numeric", "logical"))

## use the union as the data part of another class
setClass("withId", contains = "maybeNumber", slots = c(id = "character"))

w1 <- new("withId", 1:10, id = "test 1")
w2 <- new("withId", sqrt(w1)%%1 < .01, id = "Perfect squares")

## add class "complex" to the union "maybeNumber"
setIs("complex", "maybeNumber")

w3 <- new("withId", complex(real = 1:10, imaginary = sqrt(1:10)))

## a class union containing the existing class  union "OptionalFunction"
setClassUnion("maybeCode",
    c("expression", "language", "OptionalFunction"))

is(quote(sqrt(1:10)), "maybeCode")  ## TRUE


參考

Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)

相關用法


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