适用于多个类别的通用S3函数

时间:2018-10-24 10:54:04

标签: 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,日期和因子?

为了清楚起见:我需要类似的东西:

convert.(POSIXct || factor || date) <- funciton(x) {as.character(x)}

3 个答案:

答案 0 :(得分:2)

您可以使用默认方法对类进行测试,例如:

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)
}

答案 1 :(得分:2)

这样写:

convert.default <- function(x) x

convert.Date <-     
convert.factor <- 
convert.POSIXct <- function(x) as.character(x)

答案 2 :(得分:1)

由于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"