引用类字段列表中的多个可接受的类

qed*_*qed 2 r reference-class

例如:

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

在这个例子中,我想允许colorvec数字或因子或矩阵.有没有办法做到这一点?

csg*_*pie 5

三种可能性.

  1. 使用ANY类型.

    m2 = setRefClass("m2",
      fields = list(x="ANY")
    )
    
    Run Code Online (Sandbox Code Playgroud)

    正如名称所示,它允许您拥有任何类型.

  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"))
    
    Run Code Online (Sandbox Code Playgroud)

    所以

    bit = new("mult", x=10)
    m3$new(x=bit)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 有一个功能作为您的输入并检查类型.请注意,该x字段实际上并不存储任何数据,它只是检查并返回该internal值.您可以创建一个show隐藏internal字段的简单方法.

    m4 = setRefClass("m4",  
                 fields=list(x = function(y){
                   if(!missing(y) && !is.null(y)) {
                     if(!(is.numeric(y))){
                       stop("Wrong type")
                     }  
                     internal <<- y
                   } else internal}
                   , 
                 internal="ANY"
                 ))
    
    m4$new(x=10)
    m4$new(x="10")
    
    Run Code Online (Sandbox Code Playgroud)