在R语言中,通用函数和引用类是什么?

3
我正在阅读Martin Morgan关于引用类的笔记,在第7张幻灯片中,他使用setMethod来定义show函数,而没有使用setGeneric将其之前设置为通用函数。
这是为什么?是否有一份声明所有引用类通用函数(包括show)的方法列表?

这些幻灯片是在引用类还很新或者我对引用类还不熟悉的时候编写的;现在,当一个实例被打印时,会自动分派到一个 show 方法:F = setRefClass("F", methods=list(show=function() { cat(class(.self), "!\n") })) - Martin Morgan
@MartinMorgan 谢谢Martin。我想知道是否有关于引用类的更新材料,或者是否有使用引用类的重要包? - tchakravarty
2个回答

5

show已经是一个通用函数:

> isGeneric("show")
[1] TRUE

您可以通过调用getGenerics方法获取父环境中的泛型列表:
> getGenerics()
An object of class "ObjectsWithPackage":

Object:  "-"    "!="   "["    "*"    "/"    "&"    "%/%"  "%%"   "^"    "+"   
Package: "base" "base" "base" "base" "base" "base" "base" "base" "base" "base"

Object:  "<"    "<="   "=="   ">"    ">="   "|"    "$"    "$<-"  "abs"  "acos"
Package: "base" "base" "base" "base" "base" "base" "base" "base" "base" "base"

Object:  "acosh" "addNextMethod" "Arith" "asin" "asinh" "atan" "atanh" "body<-"
Package: "base"  "methods"       "base"  "base" "base"  "base" "base"  "base"  

Object:  "cbind2"  "ceiling" "coerce"  "coerce<-" "Compare" "Complex" "cos" 
Package: "methods" "base"    "methods" "methods"  "methods" "base"    "base"

Object:  "cosh" "cummax" "cummin" "cumprod" "cumsum" "digamma" "exp"  "expm1"
Package: "base" "base"   "base"   "base"    "base"   "base"    "base" "base" 

Object:  "floor" "gamma" "initialize" "kronecker" "lgamma" "loadMethod" "log" 
Package: "base"  "base"  "methods"    "base"      "base"   "methods"    "base"

Object:  "log10" "log1p" "log2" "Logic" "Math" "Math2"   "Ops"  "rbind2" 
Package: "base"  "base"  "base" "base"  "base" "methods" "base" "methods"

Object:  "round" "show"    "sign" "signif" "sin"  "sinh" "slotsFromS3" "sqrt"
Package: "base"  "methods" "base" "base"   "base" "base" "methods"     "base"

Object:  "Summary" "tan"  "tanh" "trigamma" "trunc"
Package: "base"    "base" "base" "base"     "base" 

那么,不需要显式设置为泛型方法的通用方法对于引用类是 getGenerics()[getGenerics()@package=='methods'] 吗?还是整个列表? - tchakravarty
我实际上没有使用过引用类,所以我不确定它们是如何工作的。我只看过S3和S4。如果它们依赖于泛型,我想它们的工作方式应该与S4类似。 - Scott Ritchie
嗯,好的,我没有看到cummax是S4/引用类的通用函数,所以可能只适用于methods包中的函数。我会测试一下是否正确。感谢您的答案,它让我更接近目标了。 - tchakravarty
根据我对 http://www.inside-r.org/r-doc/methods/ReferenceClasses 的浏览,你最好自己定义方法,例如 myRefClass$cummax。重点是参考类就像 Java:方法属于类,而不是每个玻璃都有函数的方法(和通用函数)。 - Scott Ritchie
你的意思是,与其每个玻璃都有一个函数(和一个通用函数),不如使用每个类都有一个方法的(通用函数)? 此外,我的意思是cummax不可能成为所有引用类的通用函数,因此只有属于methods包的函数才适用于引用类。 - tchakravarty
显示剩余2条评论

1
如果您查看?show,您会发现默认分配到showDefault。我记得曾经看到过一份其他可用方法的列表,但目前无法找到链接,所以对于您的第二个问题,我不知道。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接