我有一个这样的泛型函数:
convert <- function(x) UseMethod("simplifyResultConvert")
convert.default <- function(x) {
x
}
convert.POSIXct <- function(x) {
as.character(x)
}
convert.factor <- function(x) {
as.character(x)
}
convert.Date <- function(x) {
as.character(x)
}
有没有办法通过为类型创建一个泛型来简化它:POSIXct、Date 和因子?
为了明确一点:我需要这样的东西:
convert.(POSIXct || factor || date) <- funciton(x) {as.character(x)}
这样写:
convert.default <- function(x) x
convert.Date <-
convert.factor <-
convert.POSIXct <- function(x) as.character(x)
进一步的简化是:
convert.default <- identity
convert.Date <-
convert.factor <-
convert.POSIXct <- as.character
您可以在默认方法中测试类,例如:
convert.default <- function(x) {
if (inherits(x, "POSIXct") ||
inherits(x, "factor") ||
inherits(x, "Date"))
as.character(x)
else
x
}
这与您想要的并不完全相同,因为对象可以具有类c("POSIXct", "other")
,如果设置了convert.other()
方法,则会调用它而不是默认值。
如果你真的想要你要求的行为,你需要这三个函数,但你可以通过使用
convert.Date <- convert.factor <- convert.POSIXct <- function(x) {
as.character(x)
}
由于 S3 中没有超类,因此 S3 无法做到这一点。但是,您可以使用 S4 轻松执行此操作,它允许定义超类:
setGeneric("convert", function(object) {
standardGeneric("convert")
})
setClassUnion("fooClasses", members = c("factor", "Date", "POSIXt")) #POSIXt is a super-class
setMethod("convert", signature(object = "fooClasses"), function(object) {
as.character(object)
})
class(convert(as.Date("2010-10-10")))
#[1] "character"
class(convert(as.POSIXct("2010-10-10")))
#[1] "character"