R中的泛型函数和引用类

R中的泛型函数和引用类,r,reference-class,R,Reference Class,我正在阅读,在幻灯片7中,他使用setMethod来定义show函数,而之前没有使用setGeneric将其设置为泛型 为什么允许这样做?是否有所有引用类(包括show)都声明为泛型的方法列表?show已经是泛型函数: > isGeneric("show") [1] TRUE 通过调用getGenerics,可以获得父环境中的泛型列表: > getGenerics() An object of class "ObjectsWithPackage": Object: "-"

我正在阅读,在幻灯片7中,他使用
setMethod
来定义
show
函数,而之前没有使用
setGeneric
将其设置为泛型


为什么允许这样做?是否有所有引用类(包括
show
)都声明为泛型的方法列表?

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()
“ObjectsWithPackage”类的对象:
对象:“-”“!=”“[”“*”“/”“&”“%/%”“%%”“^”“+”
包:“base”“base”“base”“base”“base”“base”“base”“base”“base”“base”“base”

对象:“=”|“$”"$如果您查看
?show
您会看到有一个默认分派到
showDefault
。我似乎记得看到了一个假定可用的其他方法的列表,但我现在找不到它们的链接,所以对于您的第二个问题,我不知道。

那么,不需要显式设置的通用方法引用类的泛型方法是
getGenerics()[getGenerics()@package=='methods']
?还是整个列表?我实际上没有使用引用类,所以我不确定它们是如何工作的。我只研究了S3和S4。我想象它们的工作方式与S4类基本相同,尽管它们依赖泛型。嗯,好吧,我不认为
cummax
是S4/引用类的泛型,所以可能只有来自包中的那些
methods
。将测试这是否正确。感谢您的回答,这让我了解了很多方法。根据我对:,您最好还是定义自己的方法,即myRefClass$cummax。重点是引用类类似于java:方法属于类,而不是每个类都有函数的方法(和一个泛型)。“而不是每个玻璃都有函数的方法(和一个泛型)”你是指而不是(泛型)每个类都有方法的函数?另外,我的意思是,没有办法将
cummax
作为所有引用类的通用函数,因此引用类的通用函数只有那些属于包
方法的函数;现在,当一个实例被打印出来时,会自动分派到一个
show
方法:
F=setRefClass(“F”,methods=list(show=function(){cat(class(.self),“!\n”)})
@MartinMorgan谢谢Martin。我想知道引用类中是否有更新的材料,或者是否有大量使用引用类的包?