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


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