UseMethod
位于 base
包(package)。 说明
R拥有简单的通用函数机制,可用于面向对象的编程风格。方法调度基于泛型函数的第一个参数的类或作为参数提供的对象的类进行UseMethod
或者NextMethod
.
用法
UseMethod(generic, object)
NextMethod(generic = NULL, object = NULL, ...)
参数
generic |
命名函数的字符串(而不是内置运算符)。 |
object |
对于 |
... |
要传递给下一个方法的更多参数。 |
细节
一个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 generic和group generic函数。 UseMethod
当前即使对于不是对象的参数也会在隐式类上分派,但其他分派方式则不会。
NextMethod
调用下一个方法(由类向量确定,或者是提供给泛型的对象,或者是包含 NextMethod
的函数的第一个参数(如果直接调用方法)。通常 NextMethod
仅与一个参数一起使用, generic
,但如果提供更多参数,这些参数将修改对下一个方法的调用。
NextMethod
不应被调用,除非在 UseMethod
或内部泛型调用的方法中(请参阅 InternalGenerics )。特别是它不能在匿名调用函数中工作(例如 get("print.ts")(AirPassengers)
)。
命名空间可以注册通用函数的方法。为了支持这一点,UseMethod
和NextMethod
在两个地方搜索方法:在调用泛型函数的环境中,以及在定义泛型的环境(通常是命名空间)的注册数据库中。因此,泛型函数的方法需要在泛型调用的环境中可用,或者必须注册它们。 (它们在定义泛型的环境中是否可见并不重要。)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
。这些是在调度机制评估方法的环境中设置的,如下所示:
-
找到调用函数(通用函数)的上下文:这为我们提供了原始调用的未计算参数。
-
评估用于调度的对象(通常是参数),并找到一个方法(可能是默认方法)或抛出错误。
-
创建一个用于评估该方法的环境,并将特殊变量(见下文)插入该环境中。还要复制泛型环境中非形式(或实际)参数的任何变量。
-
将参数列表修复为与方法的形式匹配的调用参数。
.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 语言定义”草案。
methods
、class
包括.class2()
; getS3method
、is.object
。
相关用法
- R file.path 构造文件路径
- R grep 模式匹配和替换
- R getwd 获取或设置工作目录
- R vector 向量 - 创建、强制等
- R lapply 对列表或向量应用函数
- R dump R 对象的文本表示
- R Sys.getenv 获取环境变量
- R rank 样本排名
- R getDLLRegisteredRoutines DLL 中 C/Fortran 例程的反射信息
- R pushBack 将文本推回连接
- R strsplit 分割字符向量的元素
- R seq.Date 生成规则的日期序列
- R invisible 将打印模式更改为不可见
- R noquote “无引号”字符串打印类
- R warning 警告信息
- R rapply 递归地将函数应用于列表
- R basename 操作文件路径
- R with 评估数据环境中的表达式
- R formals 访问和操纵形式参数
- R icuSetCollate 按 ICU 设置整理
- R search 给出 R 对象的搜索路径
- R Defunct 将对象标记为已失效
- R gzcon 通过连接(解)压缩 I/O
- R readRenviron 从文件设置环境变量
- R Sys.localeconv 查找当前语言环境中数字和货币表示形式的详细信息
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Class Methods。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。