8

我正在使用一个包含几十个字段的参考类。我已经设置了一个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 领域知道更好的方法来做到这一点,可能值得一看。

4

1 回答 1

7

使用.self表示实例,使用 选择字段[[。我不是 100% 确定(但谁是?)这[[是严格合法的。我将默认值添加到lst,因此在调用 as 时它可以工作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()

于 2011-04-14T00:37:47.257 回答