0

我正在研究 R 中的一个宠物项目,该项目构建了一个名为groupr. 如Hadley 教程print.groupr中所述,我已经使用点符号 ( , )编写了一些函数,但我想扩展该函数,但找不到这样做的方法。subset.grouprapply

如教程中所示,该pryr包提供了一个提示。我看到subsetandprint函数是不同的函数类型,如下所示:

> 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

4

1 回答 1

1

你大部分时间都在那里;您确实需要覆盖原来的apply,但使用一个将原始调用作为默认值的通用函数。因此,您的包将具有三个功能:apply,它将是新的泛型,apply.default将调用base::apply,以及您的新的apply.myclass. 当你的包被加载时,你的版本apply会在搜索路径中更高,所以会被使用。我确定我已经看到包这样做,但现在不能举一个例子。

不过,我会质疑这是否值得;例如,您的用户真的会介意groupr's的版本apply_groupr吗?我们都知道apply在矩阵上使用了什么,这个新功能真的足够相似,可以共享相同的名称吗?那就是如果我看到apply(my_groupr, 2, mean)我会因为my_groupr不是矩阵而感到困惑吗?

于 2018-03-30T17:05:26.280 回答