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


R UseMethod 类方法


R语言 UseMethod 位于 base 包(package)。

说明

R拥有简单的通用函数机制,可用于面向对象的编程风格。方法调度基于泛型函数的第一个参数的类或作为参数提供的对象的类进行UseMethod或者NextMethod.

用法

UseMethod(generic, object)

NextMethod(generic = NULL, object = NULL, ...)

参数

generic

命名函数的字符串(而不是内置运算符)。 UseMethod 必需。

object

对于 UseMethod :一个对象,其类将确定要分派的方法。默认为封闭函数的第一个参数。

...

要传递给下一个方法的更多参数。

细节

一个Robject 是一个数据对象,它有一个class属性(这可以通过is.object)。类属性是一个字符向量,给出对象所属类的名称继承.

如果对象没有类属性,则它有一个隐式类。矩阵和数组有类"matrix"或者"array"接下来是基础向量的类别。大多数向量的结果类别为mode(x),除了整数向量有类c("integer", "numeric")和实向量有类c("double", "numeric")。函数.class2(x)(自从R4.0.x) 返回完整的隐式(或显式)类向量x.

当调用 UseMethod("fun") 的函数应用于具有类向量 c("first", "second") 的对象时,系统会搜索名为 fun.first 的函数,如果找到,则将其应用于该对象。如果没有找到这样的函数,则会尝试名为fun.second 的函数。如果没有类名生成合适的函数,则使用函数fun.default(如果存在),否则会产生错误。

函数 methods 可用于查找特定通用函数或类的方法。

UseMethod 是一个原始函数,但使用标准参数匹配。它不是方法调度的唯一方式,因为还有internal genericgroup generic函数。 UseMethod 当前即使对于不是对象的参数也会在隐式类上分派,但其他分派方式则不会。

NextMethod 调用下一个方法(由类向量确定,或者是提供给泛型的对象,或者是包含 NextMethod 的函数的第一个参数(如果直接调用方法)。通常 NextMethod 仅与一个参数一起使用, generic ,但如果提供更多参数,这些参数将修改对下一个方法的调用。

NextMethod 不应被调用,除非在 UseMethod 或内部泛型调用的方法中(请参阅 InternalGenerics )。特别是它不能在匿名调用函数中工作(例如 get("print.ts")(AirPassengers) )。

命名空间可以注册通用函数的方法。为了支持这一点,UseMethodNextMethod在两个地方搜索方法:在调用泛型函数的环境中,以及在定义泛型的环境(通常是命名空间)的注册数据库中。因此,泛型函数的方法需要在泛型调用的环境中可用,或者必须注册它们。 (它们在定义泛型的环境中是否可见并不重要。)R3.5.0,顶级环境后搜索注册数据库(见topenv) 的调用环境(但在顶级环境的父环境之前)。

技术细节

现在一些需要出现在某处的晦涩细节。这些评论与Chambers(1992)中的评论略有不同。 (另请参阅“R 语言定义”草案。)UseMethod 创建一个新的函数调用,其参数在进入泛型时匹配。在调用 UseMethod 之前定义的任何局部变量都将被保留(与 S 不同)。调用 UseMethod 之后的任何语句都不会被计算,因为 UseMethod 不会返回。 UseMethod 可以使用两个以上的参数调用:将给出警告并忽略其他参数。 (它们在 S 中并未完全被忽略。)如果仅使用一个参数调用它,则封闭函数的第一个参数的类将用作 object :与 S 不同,这是传递的第一个实际参数,而不是当前值该名称的对象的。

NextMethod 的工作原理是为下一个方法创建一个特殊的调用框架。如果没有提供新的参数,这些参数的数量、顺序和名称将与当前方法的参数相同,但它们的值将被承诺在当前方法和环境中计算它们的名称。与 ... 匹配的任何命名参数都会进行特殊处理:它们或者替换同名的现有参数,或者附加到参数列表中。它们作为 Promise 传递,作为当前环境的参数提供。 (S 的做法有所不同!)如果它们已在当前(或之前的环境)中进行了评估,那么它们将保持评估状态。 (这是一个复杂的领域,可能会发生变化:请参阅“R 语言定义”草案。)

NextMethod 的方法搜索与 UseMethod 的方法搜索略有不同。没有找到 fun.default 并不一定是错误,因为搜索会继续到泛型本身。这是为了选取像 [ 这样的 internal generic,它没有单独的默认方法,并且仅当泛型是 primitive 函数或同名 .Internal 函数的包装器时才会成功。 (当调用原语作为默认方法时,由于原语的语义不同,参数匹配可能无法按上述方式工作。)

您将看到方法中使用的对象,例如 .Generic.Method.Class 。这些是在调度机制评估方法的环境中设置的,如下所示:

  1. 找到调用函数(通用函数)的上下文:这为我们提供了原始调用的未计算参数。

  2. 评估用于调度的对象(通常是参数),并找到一个方法(可能是默认方法)或抛出错误。

  3. 创建一个用于评估该方法的环境,并将特殊变量(见下文)插入该环境中。还要复制泛型环境中非形式(或实际)参数的任何变量。

  4. 将参数列表修复为与方法的形式匹配的调用参数。

.Generic 是命名通用函数的长度为 1 的字符向量。

.Method 是命名方法函数的字符向量(通常长度为 1)。 (对于通用组 Ops 中的函数,其长度为 2。)

.Class 是用于查找下一个方法的类的字符向量。 NextMethod 将属性 "previous" 添加到 .Class,给出上次用于调度的 .Class,并将 .Class 移至用于调度的属性。

.GenericCallEnv.GenericDefEnv分别是调用泛型和定义泛型的环境。 (后者用于查找为泛型注册的方法。)

请注意,.Class 在调用泛型时设置,并且如果在方法中更改调度参数的类,则 .Class 保持不变。可以通过操作 .Class 来更改 NextMethod 分派的方法,但“除非您彻底了解继承机制,否则不建议这样做”(Chambers & Hastie,1992,第 469 页)。

注意

该方案称为S3(S版本3)。对于新项目,建议使用methods包中提供的更灵活、更健壮的S4方案。

参考

Chambers, J. M. (1992) Classes and methods: object-oriented programming in S. Appendix A of Statistical Models in S eds J. M. Chambers and T. J. Hastie, Wadsworth & Brooks/Cole.

也可以看看

“R 语言定义”草案。

methodsclass 包括.class2()getS3methodis.object

相关用法


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