3

在这里,最佳答案描述了一种在 S3 和 S4 对象上进行方法调度的好方法。但是,这种方式仅在两种方法具有相同签名时才有效。

median有没有办法为不同的签名创建 S4 方法?

例如,以下内容不起作用:

setGeneric("median")
median.Foo <- function(arg1, arg2, ...){}
setMethod("median", "Foo", median.Foo)

安装库时,错误提示缺少形式参数,x并且na.rm是原始中值函数的参数。

我想避免作者帖子顶部的解决方案。

4

1 回答 1

1

setGeneric("median")创建一个与 stats::median 具有相同签名的 S4 泛型

> stats::median
function (x, na.rm = FALSE) 
UseMethod("median")
<environment: namespace:stats>

所以你可以写方法

median.Foo <- function(x, na.rm=FALSE) {}
setMethod(median, "Foo", median.Foo)

认为包裹检查消息将由

setGeneric("median", function(arg1, arg2, ...) standardGeneric("median"))

然后在你写的时候。但这可能是个坏主意,因为现在 S3 方法被您的函数所掩盖

> median(1:5)
Error in (function (classes, fdef, mtable)  : 
  unable to find an inherited method for function 'median' for signature '"integer"'

我认为您坚持使用默认参数或修改后的函数名称。您帖子的标题说MedianR 区分大小写......但这也是一个坏主意。

于 2013-09-26T20:12:44.077 回答