【发布时间】:2018-09-09 17:17:53
【问题描述】:
我正在使用 R 中的 pet project 构建一个名为 groupr 的自定义 S3 类。我已经编写了一些带有点符号的函数(print.groupr、subset.groupr),如 Hadley tutorial 中所述,但我希望喜欢扩展 apply 函数并且找不到方法这样做。
如教程中所示,pryr 包提供了提示。我看到 subset 和 print 函数是不同的函数类型,如下所示:
> pryr::ftype(subset)
[1] "s3" "generic"
> pryr::ftype(apply)
[1] "function"
另外,subset 函数会在终端中打印:
function (x, ...)
UseMethod("subset")
<bytecode: 0x115f0ab88>
<environment: namespace:base>
但apply 函数会打印其整个源代码。我相信我明白为什么会发生这种情况 - print、subset、plot 等函数是 S3 函数,而 apply 是一个无聊的旧正常函数 - 但我不知道查看任何扩展 apply 函数而不“覆盖”基本函数的方法。例如,UseMethod("apply") 在加载包时将函数调用指向我的groupr 命名空间。
有谁知道如何解决这个问题?也就是说,apply 函数族不是 S3 对象,不能使用点表示法进行扩展。有谁知道如何编写apply.myclass、apply.myotherclass 函数?
【问题讨论】:
-
apply不是通用的。我相信这就是区别所在,为它编写方法应该很尴尬。就像你说的,你必须“覆盖”基本函数。