多个类的通用 S3 函数

  • 本文关键字:S3 函数 r
  • 更新时间 :
  • 英文 :


我有一个这样的泛型函数:

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"

最新更新