当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。