名字里包含了什么?
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
下面哪些说法是正确的?
is.complex()(参见文档:https://www.rdocumentation.org/packages/base/topics/is.complex)是is泛型针对complex对象的方法。seq.Date()(参见文档:https://www.rdocumentation.org/packages/base/topics/seq.Date)是seq泛型针对Date对象的方法。is.na.data.frame()(参见文档:https://www.rdocumentation.org/packages/base/topics/is.na)是is.na泛型针对data.frame对象的方法。sort()(参见文档:https://www.rdocumentation.org/packages/base/topics/sort)是一个泛型函数。order()(参见文档:https://www.rdocumentation.org/packages/base/topics/order)是一个泛型函数。
本练习是课程的一部分
