#r #reference-class
#r #ссылочный класс
Вопрос:
Например:
Mycls = setRefClass(
"Mycls",
fields = list(
# this is just a mock up
colorvec = "numeric" | "factor" | "matrix"
)
)
В этом примере я хочу разрешить colorvec
быть числовым, факторным или матричным.
Есть ли способ сделать это?
Ответ №1:
Три возможности.
- Используйте
ANY
тип.m2 = setRefClass("m2", fields = list(x="ANY") )
который, как следует из названия, позволяет вам иметь любой тип.
- Создайте другой класс, который принимает только
numerics
/factors
/matrices
:setClass("mult", representation(x="ANY")) setValidity("mult", function(object) is.numeric(object@x) || is.factor(object@x) || is.matrix(object@x) ) m3 = setRefClass("m3", fields = list(x="mult"))
Итак
bit = new("mult", x=10) m3$new(x=bit)
- Введите функцию в качестве входных данных и проверьте типы. Обратите внимание, что
x
поле фактически не хранит никаких данных, оно просто проверяет и возвращаетinternal
значение. Вы могли бы создать простойshow
метод, чтобы скрытьinternal
поле.m4 = setRefClass("m4", fields=list(x = function(y){ if(!missing(y) amp;amp; !is.null(y)) { if(!(is.numeric(y))){ stop("Wrong type") } internal <<- y } else internal} , internal="ANY" )) m4$new(x=10) m4$new(x="10")