Создание метода инициализации для ссылочного класса в R - PullRequest
0 голосов
/ 12 декабря 2018

Я хотел бы создать метод инициализации для объекта ссылочного класса в R, который предоставит значения по умолчанию для отсутствующих аргументов.В приведенном выше примере объект ссылочного класса принимает фрейм данных и несколько строк.Если в строке комментария отсутствует отметка времени, предоставляется.

Определение класса

#' Class SummaryData
#'
#' @description Odd class facilitating creation of data frame with
#'   summary information attached.
#'
#' @slot data data.frame.
#' @slot summary_columns character.
#' @slot info character.
#'
#' @return A SummaryData Class
#' @import methods
#' @exportClass SummaryData
#'
setClass(
    Class = "SummaryData",
    slots = list(
        data = "data.frame",
        summary_columns = "character",
        info = "character"
    )
)

#' Constructor method of SummaryData.
#'
#' @name SummaryData
#' @rdname SummaryData-class
setMethod("initialize", "SummaryData", function(.Object,
                                                data = "data.frame",
                                                summary_columns = "character",
                                                info = "character",
                                                ...)
{
    if (missing(data)) {
        data <- data.frame()
    }
    if (missing(summary_columns)) {
        summary_columns <- character()
    }
    if (missing(info)) {
        info <- paste("Object generated on:", Sys.time())
    }

    validObject(.Object)
    return(.Object)
})

#' Wrapper function SummaryData.
#'
#' @name SummaryData
#' @rdname SummaryData-class
#' @export
SummaryData <- function(...) {
    new("SummaryData", ...)
}

Задача

>> SummaryData(data = airquality)
An object of class "SummaryData"
Slot "data":
data frame with 0 columns and 0 rows

Slot "summary_columns":
character(0)

Slot "info":
character(0)

Желаемые результаты

  • * Слот 1013 * должен содержать результаты paste("Object generated on:", Sys.time())

  • data Слот должен содержать информацию о airquality данных, а именно:

    dim(airquality)
    [1] 153   6
    

1 Ответ

0 голосов
/ 12 декабря 2018

Вам нужно на самом деле изменить объект и вызвать метод initialize.

setClass(
  Class = "SummaryData",
  slots = list(
    data = "data.frame",
    summary_columns = "character",
    info = "character"
  )
)

# Constructor method of SummaryData.
setMethod("initialize", "SummaryData",
          function(.Object,
                   data,
                   summary_columns,
                   info,
                   ...) {

            if (!missing(data)) {
              .Object@data <- data
            }
            if (!missing(summary_columns)) {
              .Object@summary_columns <- summary_columns
            }
            if (missing(info)) {
              .Object@info <- paste("Object generated on:", Sys.time())
            }else {
              .Object@info <- info
            }

            validObject(.Object)
            return(.Object)
          }
)

# Wrapper function SummaryData.
SummaryData <- function(...) {
  initialize(new("SummaryData"), ...)
}

Теперь некоторые проверки:

SummaryData(data = airquality, info = "hey")
#Output not shown

SummaryData(data = data.frame(a = 1, b = 2))
#An object of class "SummaryData"
#Slot "data":
#  a b
#1 1 2
#
#Slot "summary_columns":
#character(0)
#
#Slot "info":
#[1] "Object generated on: 2018-12-12 20:21:09"
...