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