题
如果我有一个名为 foo
, ,然后直接超负荷 summary
功能
summary.foo = function(x, ...) print("bar")
但是,该技术与 sd
功能,就是
> bar = createFooClass()
> sd.foo = function(x, ...) print("Hi")
> sd(bar)
error: is.atomic(x) is not TRUE
超载此功能的正确方法是什么?
解决方案
您可以劫持任何非传播功能,使其(S3)通用并将原始版本设置为默认版本。例如:
## make an S3 generic for sd
sd <- function(x, ...) UseMethod("sd")
## take the usual definition of sd,
## and set it to be the default method
sd.default <- stats::sd
## create a method for our class "foo"
sd.foo = function(x, ...) print("Hi")
最后一步,如果是包裹,则是添加 ...
争论 sd.default
允许通过包装检查:
formals(sd.default) <- c(formals(sd.default), alist(... = ))
给予:
> args(sd.default)
function (x, na.rm = FALSE, ...)
NULL
> args(stats::sd)
function (x, na.rm = FALSE)
NULL
然后,这给出了期望的行为:
> bar <- 1:10
> sd(bar)
[1] 3.027650
> class(bar) <- "foo"
> sd(bar)
[1] "Hi"
这已记录在 第7.1节 撰写r扩展手册
其他提示
您需要为 sd
.
最简单的方法是使用S4,因为它可以自动处理默认的“ SD”方法:
setClass("foo", list(a = "numeric", names = "character"))
setGeneric("sd")
setMethod("sd", "foo",
function(x, na.rm = FALSE){
print("This is a foo object!")
callNextMethod(x@a)
})
tf <- new("foo", a = 1:10)
sd(tf)
#[1] "This is a foo object!"
#[1] 3.027650
查看代码 sd()
---它有效地在内部派遣。换句话说,它不是通用功能,而是普通的旧常规功能。
最简单的可能只是修改 sd()
分支在类Foo上。
不隶属于 StackOverflow