2

似乎如果我们创建一个B继承自 class的类A,则在创建A时会调用 的构造函数B。这会导致以下问题 -A其 ctor 中可能有一个强制参数(用于在实例化期间使用),因此运行以下命令:

A <- setRefClass("A", 
    methods = list(
        initialize = function(mandatoryArg) {
            print(mandatoryArg)
        }
    )
)

B <- setRefClass("B", contains = "A")

我得到错误

Error in .Object$initialize(...) : 
  argument "mandatoryArg" is missing, with no default

这似乎很奇怪 - 为什么会发生这种情况,我该怎么办?

4

1 回答 1

1

隐含的要求是没有参数的构造函数(例如,A())成功,因此为mandatoryArg

A <- setRefClass("A", 
    methods = list(
        initialize = function(mandatoryArg=character()) {
            print(mandatoryArg)
        }
    )
)

或(推荐)避免使用initialize构造方法,而是定义一个用户友好的包装器

.A <- setRefClass("A", fields=list(mandatoryField="character"))

A <- function(mandatoryArg, ...) {
    if (missing(mandatoryArg))
        stop("'mandatoryArg' missing")
    .A(mandatoryField=mandatoryArg, ...)
}

.B <- setRefClass("B", contains="A")

B <- function()
    .B()

B <- function() .B(mandatoryField="foo")B <- function() .B(A("mandatoryField"))

于 2014-02-19T15:07:34.787 回答