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


R getMethod 获取或测试方法的定义


R语言 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

f 的参数匹配的类的签名。请参阅下面的详细信息。

where

寻找方法的环境。默认情况下,如果调用来自命令行,则使用通用函数本身中定义的方法表,findMethod 除外(请参阅下面的部分)。

optional

如果 selectMethod 中的选择未找到有效方法,则会生成错误,除非 optionalTRUE ,在这种情况下,返回的值为 NULL

mlist, fdef, useInherited, verbose, doCache

getMethodselectMethod 的可选参数供内部使用。避免这些:有些会按预期工作,有些则不会,并且它们都不是正常使用函数所必需的。但有关非标准继承,请参阅“as() 的方法”部分。

细节

signature 参数指定类,对应于泛型函数的形式参数;准确地说,是通用函数对象的signature槽。参数可以是标识类的字符串向量,并且可以命名或不命名。名称(如果提供)与泛型签名中包含的正式参数的名称相匹配。该签名通常是除 ... 之外的所有参数。但是,可以仅使用允许的参数子集或使用以不同顺序获取参数的签名来指定通用函数。

如果您正在处理对其签名执行特殊操作的泛型,最好在签名中命名参数以避免混淆。在任何情况下,签名的元素都会按照函数调用中匹配参数所使用的相同规则与正式签名进行匹配(请参阅 match.call )。

签名中的字符串可以是类名、 "missing""ANY" 。请参阅Methods_Details 了解这些在方法选择中的含义。签名中未提供的参数隐式对应于类 "ANY" ;特别是,给出一个空签名意味着寻找默认方法。

getMethod 的调用返回特定函数和签名的方法。方法的搜索不使用继承。

函数selectMethod也根据函数和签名查找方法,但充分利用了方法分派机制;即,继承的方法和组泛型被考虑在内,就像它们在为相应的签名分派方法时一样,但有一个例外,即不使用条件继承。与 getMethod 类似,selectMethod 返回 NULL 或在未找到该方法时生成错误,具体取决于参数 optional

selectMethodgetMethod 通常都会在 R 会话中使用当前版本的通用函数,该函数有一个从会话中加载的所有包中获取的方法表。可选参数可以导致从指定环境搜索通用函数,但这很少是一个有用的想法。相反,findMethod 具有不同的默认值,并且可能需要可选的where= 参数。请参阅“使用findMethod()”部分。

函数existsMethodhasMethod根据是否找到方法返回TRUEFALSE,第一个对应于getMethod(无继承),第二个对应于selectMethod

selectMethodgetMethod 的调用将返回选定的方法(如果找到)。 (此类扩展了 function ,因此如果您想要的话,您可以直接将结果用作函数。)否则,如果 optionalFALSE ,则会抛出错误,如果 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-devel大神的英文原创作品 Get or Test for the Definition of a Method。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。