Несколько допустимых классов в списке полей ссылочного класса

#r #reference-class

#r #ссылочный класс

Вопрос:

Например:

 Mycls = setRefClass(
    "Mycls",
    fields = list(
    # this is just a mock up
    colorvec = "numeric" | "factor" | "matrix"
    )
)
 

В этом примере я хочу разрешить colorvec быть числовым, факторным или матричным.
Есть ли способ сделать это?

Ответ №1:

Три возможности.

  1. Используйте ANY тип.
     m2 = setRefClass("m2",
      fields = list(x="ANY")
    )
     

    который, как следует из названия, позволяет вам иметь любой тип.

  2. Создайте другой класс, который принимает только 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)
     
  3. Введите функцию в качестве входных данных и проверьте типы. Обратите внимание, что 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")