Общая функция S3 для нескольких классов - PullRequest
0 голосов
/ 24 октября 2018

У меня есть универсальная функция, подобная этой:

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 and factor?

Чтобы было понятно: мне нужно что-то вроде:

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

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Напишите так:

convert.default <- function(x) x

convert.Date <-     
convert.factor <- 
convert.POSIXct <- function(x) as.character(x)
0 голосов
/ 24 октября 2018

Поскольку в 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"
0 голосов
/ 24 октября 2018

Вы можете поместить тест класса в метод по умолчанию, например:

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...