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


R is 对象是来自类吗?


R语言 is 位于 methods 包(package)。

说明

用于测试对象和类之间或两个类之间的继承关系的函数 (extends )。

用法

is(object, class2)

extends(class1, class2, maybe = TRUE, fullInfo = FALSE)

参数

object

任何R对象。

class1, class2

给出要检查 is 关系的两个类中的每一个的名称的字符串,或者(更有效地)这些类的类定义对象。

fullInfo

在对 extends 的调用中,如果缺少 class2,则 fullInfo 是一个标志,如果 TRUE 会导致返回类 SClassExtension 的对象列表,而不仅仅是类的名称。在实践中,只有距离槽可能有用;请参阅“选择超类”部分;

maybe

有条件继承返回什么。但这种关系很少使用,也不推荐,因此不需要这个论点。

选择超类

selectSuperClasses(cl) 的调用会返回超类列表,类似于 extends(cl) 。附加参数将返回的类名限制为直接超类和/或非虚拟类。

无论哪种方式,使用结果进行编程,特别是使用 sapply ,都是有用的。

要查找具有更通用定义属性的超类,可以使用 extends 在以一个类作为参数调用时返回的结果进行编程。默认情况下,调用返回一个字符向量,其中包括类本身及其所有超类的名称。或者,如果使用 fullInfo = TRUE 调用 extends ,则返回值是一个命名列表,其名称是前一个字符向量。与超类相对应的列表的元素是类 SClassExtension 的对象。在这些对象中的信息中,有一项可能有用:类之间的代数,由 "distance" 槽给出。

使用 extends 调用的结果进行编程,特别是使用 sapply ,可以选择超类。编程技术是定义一个测试函数,该函数为遵守某些要求的超类或关系返回TRUE。例如,要仅查找 next-to-direct 超类,请将此函数与扩展对象列表一起使用:

function(what) is(what, "SClassExtension") && what@distance == 2

或者,要仅查找 "myPkg" 中的超类,请将此函数与简单的名称向量结合使用:

function(what) getClassDef(what)@package == "myPkg"

将此类函数作为参数提供给在 extends 的输出上调用的 sapply,可以让您找到具有所需属性的超类。请参阅下面的示例。

请注意,使用扩展对象的函数必须测试其参数的类,因为不幸的是,为此目的, extends 返回的列表包括 class1 本身,作为对象 TRUE

注意

之前R4.2.0 代码使用了第一个元素class1class2,默默地,现在要求这些是长度为一的字符向量。

例子

## Not run: 
## this example can be run if package XRPython from CRAN is installed.
supers <- extends("PythonInterface")
## find all the superclasses from package XR
fromXR <- sapply(supers,
    function(what) getClassDef(what)@package == "XR")
## print them
supers[fromXR]

## find all the superclasses at distance 2
superRelations <- extends("PythonInterface", fullInfo = TRUE)
dist2 <- sapply(superRelations,
    function(what) is(what, "SClassExtension") && what@distance == 2)
## print them
names(superRelations)[dist2]


## End(Not run)

参考

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

也可以看看

虽然 inherits 是为 S3 类定义的,但它已被修改,以便返回的结果几乎总是等于 is ,无论是对于 S4 还是非 S4 对象。由于它是用C实现的,所以速度要快一些。唯一的不等价性是由于使用 setIs 引起的,这种情况很少会遇到。

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Is an Object from a Class?。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。