список (или массив) объекта RefClass в ссылочном классе - PullRequest
2 голосов
/ 25 марта 2012

Я могу создать родительский класс, содержащий объект

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".

1 Ответ

0 голосов
/ 11 августа 2018

Вы можете использовать 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 (объект): 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)
...