我正在使用一个带有几十个字段的引用类.我已经设置了一个initialize()采用列表对象的方法.虽然有些字段依赖于列表元素的进一步计算,但大多数字段都是从列表元素直接分配的:
fieldA <<- list$A
fieldB <<- list$B
Run Code Online (Sandbox Code Playgroud)
我当时觉得自动化这个很好.举一个R伪代码的例子(这个例子显然不起作用):
for (field in c('A', 'B', 'C', 'D'))
field <<- list[[field]]
Run Code Online (Sandbox Code Playgroud)
我已经尝试过几次结束运行<<-,例如:
for field in c('A', 'B', 'C', 'D'))
do.call('<<-' c(field, list[[field]]))
Run Code Online (Sandbox Code Playgroud)
但没有骰子.
我的猜测是,在目前的参考类化身中,这种行为根本不可能,但是认为在SO土地上有人知道有更好的方法可以做到这一点可能是值得的.
使用.self指示实例,并使用选择字段[[.我不是百分百肯定(但是谁曾经?)这[[是完全合法的.我添加了默认值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))
Run Code Online (Sandbox Code Playgroud)
或者保留选项以将列表或元素本身传递给用户
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))
Run Code Online (Sandbox Code Playgroud)
这似乎也更容忍从调用中省略一些值new().