参考类中RefClass对象的列表(或数组)

时间:2012-03-25 00:09:07

标签: r reference-class

我可以创建一个包含对象的父类

setRefClass("img",fields=list(name="character"))
setRefClass("imgs",fields=list(img="img"))

但是,我想创建一个带有其他RefClass对象数组的RefClass对象。 我可以使用“列表”作为占位符并手动填写,但有更好的方法吗?

例如,是否可以指定“list”类型来保存其中的某个对象? 假设,这样的事情:(但不起作用)

setRefClass("img",fields=list(name="character"))
setRefClass("imgs",contains=list(imgList=list("img")))

我希望当我在“imgList”上调用一个方法时,它知道为每个“img”元素调用方法。

1 个答案:

答案 0 :(得分:0)

您可以使用setValidity来确保list中的每个元素都是某个类。

img <- setRefClass("img", fields = list(name = "character"))
imgs <- setRefClass("imgs", fields = list(imgList = "list"))
validImgs <- function(object) {
  if (length(object$imgList) == 0) {
    stop("`imgs` must contain at least one object of class `img`.")
  }
  sapply(object$imgList, function(x) {
    if (class(x)[1] != "img") {
      stop("Each element in `imgList` must be of class `img`")
    }
  })
  T
}
setValidity("imgs", validImgs)

这是imgs验证失败的两个示例。

# An invalid image object.
imgs$new(imgList = list())
  

validityMethod(object)中的错误:imgs必须包含至少一个   类img的对象。

# Another invalid image object.
imgs$new(imgList = list(1))
  

FUN(X [[i]],...)中的错误:imgList中的每个元素必须为   类img

这里是imgs通过验证的示例。

# A valid image object.
imgs$new(imgList = list(img$new()))

Reference class object of class "imgs"
Field "imgList":
[[1]]
Reference class object of class "img"
Field "name":
character(0)