为什么`预测'不是通用函数?

use*_*795 4 r

为什么predict不是通用功能?isGeneric('predict')FALSE,但isGeneric('summary')isGeneric('print')TRUE.他们都有方法,可以列出methods('predict')等?因此predict不是这里描述的通用函数(从查看中也很明显class),但仍然根据传递给它的对象(例如predict.lmpredict.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.

太棒了?

  • 在https://github.com/hadley/roxygen3/blob/master/R/s3.r上有一些代码来检测S3方法.这很难! (5认同)