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

时间:2011-04-13 19:44:35

标签: r reference-class

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

1 个答案:

答案 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()的调用中省略某些值。