在引用的初始化方法中使用缺失 class

Using missing within initialize method of a reference class

我想为虚拟引用创建一个生成器函数 class,如果没有给出参数,它将创建正确 classes 的空对象。

代码

#' 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(comment(info))) {
        info <- character()
    }

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

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

问题

SummaryData(data = mtcars, summary_columns = c("cyl", "mpg"), info = "Cars data")

出现此错误:

Error in missing(comment(info)) : invalid use of 'missing'
SummaryData(data = mtcars, summary_columns = c("cyl", "mpg"))
Error in missing(comment(info)) : invalid use of 'missing'

想要的结果

第二个调用应该创建 SummaryData 具有空 info 字符串的对象。

尝试使用 missing("data")do.call(missing, list("data")) 而不是 missing(data)。他们都应该工作。

但是,您不能将它与 comment(info) 一起使用,因为 missing 只接受参数名称,而 comment 更愿意 return NULL。我猜,只要将参数提供给函数调用,就不会遗漏。所以,你需要先检查参数 info 然后再做任何你想做的事。


希望这有帮助。