为什么predict不是通用功能?isGeneric('predict')是FALSE,但isGeneric('summary')并isGeneric('print')是TRUE.他们都有方法,可以列出methods('predict')等?因此predict不是这里描述的通用函数(从查看中也很明显class),但仍然根据传递给它的对象(例如predict.lm或predict.glm)调度方法.那么R调度方法有不同的方式吗?如何测试函数是否具有方法以使上述所有示例都为真?是的,我可以测试长度,methods('predict')但是对于没有方法的函数会产生警告.
Spa*_*man 15
对于初学者来说,这些函数都不是通用的测试:
> isGeneric('predict')
[1] FALSE
> isGeneric('summary')
[1] FALSE
> isGeneric('print')
[1] FALSE
Run Code Online (Sandbox Code Playgroud)
让我们再试一次...
> isGeneric("summary")
[1] FALSE
> require(sp)
Loading required package: sp
> isGeneric("summary")
[1] TRUE
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?好吧,isGeneric只测试S4泛型函数,当我启动R时summary是S3泛型函数.如果一个包想要使用S4方法和类,并且已经存在S3泛型函数,那么它可以创建一个S4泛型.
所以,最初summary是:
> summary
function (object, ...)
UseMethod("summary")
<bytecode: 0x9e4fc08>
<environment: namespace:base>
Run Code Online (Sandbox Code Playgroud)
这是一个S3泛型.我得到了sp包裹......
> require(sp)
Loading required package: sp
> summary
standardGeneric for "summary" defined from package "base"
function (object, ...)
standardGeneric("summary")
<environment: 0x9f9d428>
Methods may be defined for arguments: object
Use showMethods("summary") for currently available ones.
Run Code Online (Sandbox Code Playgroud)
现在summary是S4标准通用.
S3泛型方法通过调用发送(通常){generic}.{class},这就是UseMethod("summary")S3 summary泛型函数中的做法.
如果你想测试一个函数是否有特定类的方法,那么你可能必须测试它有一个S4方法(使用S4方法元数据的函数)和一个S3方法(通过查找一个被调用的函数{generic}.{class},如summary.glm.
太棒了?