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


R S4groupGeneric S4组通用函数


R语言 S4groupGeneric 位于 methods 包(package)。

说明

可以为组通用函数定义方法。每个组通用函数都有多个与其关联的成员通用函数。

为组通用函数定义的方法会导致为组的每个成员定义相同的方法,但为组的成员显式定义的方法优先于为组通用函数定义的具有相同签名的方法。

本文档页面中显示的函数全部驻留在methods 包中,但任何程序员都可以通过调用setGroupGeneric(提供附加的包methods)来使用该机制。

用法

## S4 group generics:
Arith(e1, e2)
Compare(e1, e2)
Ops(e1, e2)
Logic(e1, e2)
Math(x)
Math2(x, digits)
Summary(x, ..., na.rm = FALSE)
Complex(z)

参数

x, z, e1, e2

对象。

digits

roundsignif 中使用的位数。

...

传入或传出方法的更多参数。

na.rm

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

细节

可以通过以通常的方式调用setMethod 来为组通用函数定义方法。请注意,永远不要直接调用组通用函数 - 如果直接调用,将会产生一条合适的错误消息。当加载组泛型的元数据时,定义的方法将成为组成员的方法,但前提是没有直接为同一签名的成员函数指定方法。其效果是在继承的方法之前但在直接指定的方法之后选择组通用定义。有关方法选择的更多信息,请参阅Methods_Details

还有S3组Math,Ops,SummaryComplex, 看?S3groupGeneric,没有对应的R对象,但这些与 S4 组通用函数无关。

特定泛型定义的组成员可以通过调用 getGroupMembers 来获取。对于当前在此包中定义的组通用函数,其成员如下:

Arith

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

Compare

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

Logic

"&""|"

Ops

"Arith" , "Compare" , "Logic"

Math

"abs","sign","sqrt","ceiling","floor","trunc","cummax","cummin","cumprod","cumsum","log","log10","log2","log1p","acos","acosh","asin","asinh","atan","atanh","exp","expm1","cos","cosh","cospi","sin","sinh","sinpi","tan","tanh","tanpi","gamma","lgamma","digamma","trigamma"

Math2

"round" , "signif"

Summary

"max" , "min" , "range" , "prod" , "sum" , "any" , "all"

Complex

"Arg" , "Conj" , "Im" , "Mod" , "Re"

请注意,Ops 仅由三个子组组成。

这些组中的所有函数(除了组泛型本身)都是基本函数R。默认情况下,它们不是 S4 通用函数,并且其中许多被定义为原语。但是,您仍然可以单独或通过组泛型为它们定义形式方法。这一切或多或少都如你所期望的那样,诚然是通过一些后台的欺骗手段实现的。看Methods_Details详情。

请注意,Math 组的两个成员 logtrunc 将 ... 作为额外的正式参数。由于 Math 的方法只有一个形式参数,因此您必须为这些函数设置一种特定方法,以便使用额外的参数调用它们。

有关组通用函数的更多详细信息,请参阅第二个参考文献的第 10.5 节。

例子

setClass("testComplex", slots = c(zz = "complex"))
## method for whole group "Complex"
setMethod("Complex", "testComplex",
          function(z) c("groupMethod", callGeneric(z@zz)))
## exception for Arg() :
setMethod("Arg", "testComplex",
          function(z) c("ArgMethod", Arg(z@zz)))
z1 <- 1+2i
z2 <- new("testComplex", zz = z1)
stopifnot(identical(Mod(z2), c("groupMethod", Mod(z1))))
stopifnot(identical(Arg(z2), c("ArgMethod", Arg(z1))))

参考

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.5)

也可以看看

在为组泛型编写方法时,函数 callGeneric 几乎总是相关的。请参阅下面的示例以及数据分析软件第 10.5 节中的示例。

有关 S3 组泛型,请参阅S3groupGeneric

相关用法


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