getMethod
位于 methods
包(package)。 说明
如果参数具有 signature
指定的类,则函数 selectMethod()
返回将选择用于调用函数 f
的方法。找不到方法是一个错误,除非参数 optional = TRUE
,在这种情况下返回 NULL
。
函数 findMethod()
返回包含指定函数和签名的方法的环境列表;默认情况下,这些是当前搜索列表中包的子集。有关详细信息,请参阅“使用findMethod()
”部分。
函数 getMethod()
返回与提供的函数和签名相对应的方法,类似于 selectMethod
,但不使用继承或组泛型。
函数 hasMethod()
和 existsMethod()
分别测试 selectMethod()
或 getMethod()
是否找到匹配的方法。
用法
selectMethod(f, signature, optional = FALSE, useInherited =,
mlist = , fdef = , verbose = , doCache = )
findMethod(f, signature, where)
getMethod(f, signature = character(), where, optional = FALSE,
mlist, fdef)
existsMethod(f, signature = character(), where)
hasMethod(f, signature = character(), where)
参数
f |
通用函数或函数的字符串名称。 |
signature |
与 |
where |
寻找方法的环境。默认情况下,如果调用来自命令行,则使用通用函数本身中定义的方法表, |
optional |
如果 |
mlist, fdef, useInherited, verbose, doCache |
|
细节
signature
参数指定类,对应于泛型函数的形式参数;准确地说,是通用函数对象的signature
槽。参数可以是标识类的字符串向量,并且可以命名或不命名。名称(如果提供)与泛型签名中包含的正式参数的名称相匹配。该签名通常是除 ... 之外的所有参数。但是,可以仅使用允许的参数子集或使用以不同顺序获取参数的签名来指定通用函数。
如果您正在处理对其签名执行特殊操作的泛型,最好在签名中命名参数以避免混淆。在任何情况下,签名的元素都会按照函数调用中匹配参数所使用的相同规则与正式签名进行匹配(请参阅 match.call
)。
签名中的字符串可以是类名、 "missing"
或 "ANY"
。请参阅Methods_Details 了解这些在方法选择中的含义。签名中未提供的参数隐式对应于类 "ANY"
;特别是,给出一个空签名意味着寻找默认方法。
对 getMethod
的调用返回特定函数和签名的方法。方法的搜索不使用继承。
函数selectMethod
也根据函数和签名查找方法,但充分利用了方法分派机制;即,继承的方法和组泛型被考虑在内,就像它们在为相应的签名分派方法时一样,但有一个例外,即不使用条件继承。与 getMethod
类似,selectMethod
返回 NULL
或在未找到该方法时生成错误,具体取决于参数 optional
。
selectMethod
和 getMethod
通常都会在 R 会话中使用当前版本的通用函数,该函数有一个从会话中加载的所有包中获取的方法表。可选参数可以导致从指定环境搜索通用函数,但这很少是一个有用的想法。相反,findMethod
具有不同的默认值,并且可能需要可选的where=
参数。请参阅“使用findMethod()
”部分。
函数existsMethod
和hasMethod
根据是否找到方法返回TRUE
或FALSE
,第一个对应于getMethod
(无继承),第二个对应于selectMethod
。
值
对selectMethod
或getMethod
的调用将返回选定的方法(如果找到)。 (此类扩展了 function
,因此如果您想要的话,您可以直接将结果用作函数。)否则,如果 optional
是 FALSE
,则会抛出错误,如果 optional
是,则返回 NULL
TRUE
。
返回的方法对象是 MethodDefinition
对象,但基元函数的默认方法必须是基元本身。因此请注意,搜索失败的唯一可靠测试是 is.null()
。
findMethod
的返回值是找到相应方法的环境列表;即,包含指定方法的方法表。
使用findMethod()
顾名思义,此函数的行为类似于 find
,它在当前搜索列表中生成具有并已导出指定对象的包列表。默认情况下,findMethod
也是这样做的。在这种情况下,“exported” 部分意味着包的命名空间具有用于此通用函数的 exportMethods
指令。
一个重要的区别是,缺少这样的指令并不会阻止在加载包后调用包中的方法。否则,包中的代码无法使用un-exported方法。
因此,如果您的问题是加载包 thisPkg
是否会为此函数和签名定义方法,则需要询问有关包的命名空间的问题:
findMethod(f, signature, where = asNamespace("thisPkg"))
如果包未导出该方法,则附加该方法并调用不带 where
参数的 findMethod
将找不到该方法。
另请注意,签名的长度必须是相应包使用的长度。如果 thisPkg
只有一个参数的方法,则只有长度为 1 的签名会匹配(没有尾随 "ANY"
),即使当前加载的另一个包具有带有更多参数的签名。
as()
的方法
函数 setAs
允许包定义将一类对象强制到另一类的方法。这是通过为通用函数 coerce(from,
to)
定义方法在内部工作的,该函数不能直接调用。
R评估器使用不同形式的继承来选择用于此目的的方法。虽然可以为被强制的对象继承方法,但不能为目标类继承方法,因为结果不是该类的有效对象。如果您想检查选择过程,则必须提供可选参数useInherited = c(TRUE, FALSE)
到selectMethod
.
例子
testFun <- function(x)x
setGeneric("testFun")
setMethod("testFun", "numeric", function(x)x+1)
hasMethod("testFun", "numeric") # TRUE
hasMethod("testFun", "integer") #TRUE, inherited
existsMethod("testFun", "integer") #FALSE
hasMethod("testFun") # TRUE, default method
hasMethod("testFun", "ANY")
参考
Chambers, John M. (2016) Extending R, Chapman & Hall. (Chapters 9 and 10.)
Chambers, John M. (2008) Software for Data Analysis: Programming with R Springer. (Section 10.6 for some details of method selection.)
也可以看看
Methods_Details
为方法选择的详细信息; GenericFunctions
用于其他函数操作方法和通用函数对象; MethodDefinition
用于表示方法定义的类。
相关用法
- R getClass 获取类定义
- R getPackageName 与给定包关联的名称
- R as 强制对象属于某个类
- R language-class 表示未评估语言对象的类
- R className 类名包含对应的包
- R BasicClasses 基本数据类型对应的类
- R callGeneric 从方法调用当前通用函数
- R findClass 查找类定义
- R setOldClass 注册旧式 (S3) 类和继承
- R ReferenceClasses 具有按引用处理的字段的对象(OOP 样式)
- R MethodsList 方法列表对象
- R setGroupGeneric 创建函数的组通用版本
- R StructureClasses 基本结构对应的类
- R showMethods 显示指定函数或类的所有方法
- R slot 正式类对象中的槽
- R S4groupGeneric S4组通用函数
- R methodUtilities 用于方法和 S-Plus 兼容性的实用函数
- R evalSource 使用源文件中的函数定义,无需重新安装包
- R is 对象是来自类吗?
- R isSealedMethod 检查密封方法或类
- R cbind2 按列或行组合两个对象
- R GenericFunctions 管理通用函数的工具
- R dotsMethods 在方法签名中使用...
- R S3Part 包含 S3 类的 S4 类
- R nonStructure-class 基本类型的非结构 S4 类
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Get or Test for the Definition of a Method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。