2

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

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

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

例如,可以指定一个“列表”类型来保存某个对象吗?假设是这样的:(但不起作用)

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

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

4

1 回答 1

0

您可以使用setValidity来确保 a 中的每个元素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())

有效性方法(对象)中的错误: 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)
于 2018-08-11T02:43:50.273 回答