Используйте .self
, чтобы указать экземпляр, и выберите поля, используя [[
. Я не уверен на 100% (но кто вообще?), Что [[
строго законно. Я добавил значения по умолчанию к lst
, поэтому он работает, когда вызывается как C$new()
, неявное предположение в S4, которое, похоже, похоже на кусочки аналогичным образом с эталонными классами.
C <- setRefClass("C",
fields=list(a="numeric", b="numeric", c="character"),
methods=list(
initialize=function(..., lst=list(a=numeric(), b=numeric(), c=character())
{
directflds <- c("a", "b")
for (elt in directflds)
.self[[elt]] <- lst[[elt]]
.self$c <- as.character(lst[["c"]])
.self
}))
c <- C$new(lst=list(a=1, b=2, c=3))
Или оставьте опцию для передачи списка или самих элементов пользователю с помощью
B <- setRefClass("B",
fields=list(a="numeric", b="numeric", c="character"),
methods=list(
initialize=function(..., c=character()) {
callSuper(...)
.self$c <- as.character(c)
.self
}))
b0 <- B$new(a=1, b=2, c=3)
b1 <- do.call(B$new, list(a=1, b=2, c=3))
Это также, кажется, более терпимо к пропуску некоторых значений из вызова new()
.