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


R groupGeneric S3组通用函数


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

说明

可以为以下预先指定的函数组定义组通用方法,Math,Ops,matrixOps,SummaryComplex。 (基础中没有这些名称的对象R,但有在methods包,还没有matrixOps.)

为组中的单个成员定义的方法优先于为整个组定义的方法。

用法

## S3 methods for group generics have prototypes:
Math(x, ...)
Ops(e1, e2)
Complex(z)
Summary(..., na.rm = FALSE)
matrixOps(x, y)

参数

x , y , z , e1 , e2

对象。

...

进一步的参数传递给方法。

na.rm

逻辑:缺失值应该被删除吗?

细节

有五个团体可以为其编写 S3 方法,即"Math","Ops","Summary","matrixOps", 和"Complex"组。这些不是R基础中的物体R,但可以为它们提供方法和基础R包含factor,data.framedifftime前三组的方法。 (还有一个ordered方法用于Ops,POSIXtDate方法用于MathOps,package_version方法用于OpsSummary, 以及ASAts方法用于Ops包装内stats.)

  1. "Math"

    • abs,sign,sqrt,
      floor,ceiling,trunc,
      round,signif

    • exp,log,expm1,log1p,
      cos,sin,tan,
      cospi,sinpi,tanpi,
      acos,asin,atan

      cosh,sinh,tanh,
      acosh,asinh,atanh

    • lgamma , gamma , digamma , trigamma

    • cumsum , cumprod , cummax , cummin

    该小组的成员在 x 上调度。大多数成员仅接受一个参数,但成员 logroundsignif 接受一两个参数,而 trunc 接受一个或多个参数。

  2. "Ops"

    • "+" , "-" , "*" , "/" , "^" , "%%" , "%/%"

    • "&" , "|" , "!"

    • "==" , "!=" , "<" , "<=" , ">=" , ">"

    该组包含二元和一元运算符( +-! ):当遇到一元运算符时,将使用一个参数调用 Ops 方法,并且 e2 会丢失。

    在调度该组的任何成员时都会考虑这两个参数的类。对于每个参数,检查其类向量以查看是否存在匹配的特定(首选)或 Ops 方法。如果仅为一个参数找到一种方法,或者为两个参数找到相同的方法,则使用该方法。如果发现不同的方法,则调用通用chooseOpsMethod()来选择适当的方法。 (有关详细信息,请参阅?chooseOpsMethod)。如果 chooseOpsMethod() 无法解析该方法,则会出现有关“不兼容方法”的警告:在这种情况下,或者如果任一参数都找不到方法,则使用内部方法。

    请注意,用于比较( "Compare" : ==< 、 ...)和逻辑( "Logic" : & |! )运算符的 data.frame 方法返回逻辑值matrix 而不是数据帧,以方便和向后兼容。

    如果该组的成员作为函数调用,则删除任何参数名称以确保始终使用位置匹配。

  3. "matrixOps"

    • "%*%"

    该组当前仅包含矩阵乘法 %*% 二元运算符,其中至少应遵循 crossprod()tcrossprod()。该组的成员与 Ops 组具有相同的调度语义(使用两个参数)。

  4. "Summary"

    • all , any

    • sum , prod

    • min , max

    • range

    该组的成员根据提供的第一个参数进行调度。

    请注意,"Summary""Math" 组的 data.frame 方法需要 “numeric-alike” 列 x ,即满足

          is.numeric(x) || is.logical(x) || is.complex(x)
  5. "Complex"

    • Arg , Conj , Im , Mod , Re

    该小组的成员在 z 上调度。

请注意,仅当方法对应于 "class" 属性时,该方法才会用于这些组之一或其成员之一,因为内部代码在 oldClass 上分派,而不是在 class 上分派。这是为了提高效率:必须在 Ops.integer 上进行调度会太慢。

在分派之前不会检查为 "Math" 组泛型方法的原始成员提供的参数数量。

组通用函数的参数没有惰性求值。

技术细节

这些函数都是原始函数和 internal generic

方法分派和变量(例如 .Generic)的详细信息在 UseMethod 的帮助中讨论。有一些小的差异:

  • 对于 Ops 组的运算符,对象 .Method 是一个 length-two 字符向量,其元素分别是为左参数和右参数选择的方法。 (如果未选择任何方法,则相应的元素为 "" 。)

  • 对象 .Group 记录用于调度的组(如果使用特定方法,则为 "" )。

注意

methods 确实包含具有这些名称的对象,它以令人困惑的类似(但不同)的方式重新使用了这些对象。请参阅该包的帮助。

例子

require(utils)

d.fr <- data.frame(x = 1:9, y = stats::rnorm(9))
class(1 + d.fr) == "data.frame" ##-- add to d.f. ...

methods("Math")
methods("Ops")
methods("Summary")
methods("Complex")  # none in base R

参考

Appendix A, Classes and Methods of
Chambers, J. M. and Hastie, T. J. eds (1992) Statistical Models in S. Wadsworth & Brooks/Cole.

也可以看看

methods 用于非内部泛型函数的方法。

S4groupGeneric 用于 S4 方法的组泛型。

相关用法


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