在R中的引用类的initialize()方法中自动赋值

geo*_*try 8 r reference-class

我正在使用一个带有几十个字段的引用类.我已经设置了一个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土地上有人知道有更好的方法可以做到这一点可能是值得的.

Mar*_*gan 7

使用.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().