开始使用免费开始使用

名字里包含了什么?

S3 使用严格的命名约定:所有 S3 方法的名称都采用 generic.class 的形式。

反之则不然:函数名中带点并不一定是 S3 方法。很多早期 S 语言时代就存在的函数都是如此。比如,all.equal()(参见文档:https://www.rdocumentation.org/packages/base/topics/all.equal)其实是一个 S3 泛型,而不是方法。(这也说明 leopard.case 容易让人困惑。)

您可以通过 pryr 包中的 is_s3_generic()(参见文档:https://www.rdocumentation.org/packages/pryr/topics/iss3generic)来检查某个函数是否为 S3 泛型。您也可以直接打印它(在控制台输入其名称),看看它是否调用了 UseMethod()

类似地,您可以通过 pryr 中的 is_s3_method()(参见文档:https://www.rdocumentation.org/packages/pryr/topics/iss3generic)来检查某个函数是否为 S3 方法。例如,

library(pryr)
is_s3_generic("t")           # generic transpose function
is_s3_method("t.data.frame") # transpose method for data.frames
is_s3_method("t.test")       # a function for Student's t-tests 

下面哪些说法是正确的?

  1. is.complex()(参见文档:https://www.rdocumentation.org/packages/base/topics/is.complex)是 is 泛型针对 complex 对象的方法。
  2. seq.Date()(参见文档:https://www.rdocumentation.org/packages/base/topics/seq.Date)是 seq 泛型针对 Date 对象的方法。
  3. is.na.data.frame()(参见文档:https://www.rdocumentation.org/packages/base/topics/is.na)是 is.na 泛型针对 data.frame 对象的方法。
  4. sort()(参见文档:https://www.rdocumentation.org/packages/base/topics/sort)是一个泛型函数。
  5. order()(参见文档:https://www.rdocumentation.org/packages/base/topics/order)是一个泛型函数。

本练习是课程的一部分

R 中的 S3 与 R6 面向对象编程

查看课程

动手互动练习

通过我们的互动练习之一,将理论转化为实践

开始练习