我正在使用带有几十个字段的引用类。我已经设置了一个initialize()
方法来获取列表对象。虽然有些字段依赖于列表元素的进一步计算,但大多数字段都是从列表元素中直接分配的:
fieldA <<- list$A
fieldB <<- list$B
我当时觉得自动化这个很好。举一个R伪代码的例子(这个例子显然不起作用):
for (field in c('A', 'B', 'C', 'D'))
field <<- list[[field]]
我已尝试在<<-
周围进行一些结束运行,例如:
for field in c('A', 'B', 'C', 'D'))
do.call('<<-' c(field, list[[field]]))
但没有骰子。
我的猜测是,这种行为在参考类的当前化身中是不可能的,但是认为如果有人在SO土地上知道更好的方法可能是值得的。
答案 0 :(得分:7)
使用.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()
的调用中省略某些值。