【问题标题】:Validity Method for Reference Classes引用类的有效性方法
【发布时间】:2015-05-26 02:31:06
【问题描述】:

在 S4 中我可能会这样做:

setClass(
  "test", slots=c(a="integer"), 
   validity=function(object) if(length(object@a) != 1L) "not scalar" else TRUE
)

参考类的等价物是什么?我在引用类的上下文中找不到对有效性函数的任何引用。我必须依赖定义 setter 类吗?尽管基于参考类文档中的此评论:

许多使用 OOP 编程范式的系统推荐或强制执行与每个字段对应的 getter 和 setter 方法,而不是通过名称直接访问。如果你喜欢这种风格并且想通过 x$getAbc() 提取一个名为 abc 的字段并通过 x$setAbc(value) 分配它,那么 $accessors 方法是一个方便的函数,它为指定的字段创建这样的 getter 和 setter 方法。 否则没有理由使用这种机制

似乎应该有另一种方式。

【问题讨论】:

    标签: r oop


    【解决方案1】:

    可以在引用类上设置有效性方法

    .A <- setRefClass("A", fields=list(x="numeric"))
    
    setValidity("A", function(object) {
        if (length(object$x) != 1)
            "'x' must be length 1"
        else TRUE
    })
    

    但并非在所有可能有用的情况下都调用它

    > .A()
    Reference class object of class "A"
    Field "x":
    numeric(0)
    > .A(x=1:5)
    Reference class object of class "A"
    Field "x":
    [1] 1 2 3 4 5
    > validObject(.A(x=1:5))
    Error in validObject(.A(x = 1:5)) : 
      invalid class "A" object: 'x' must be length 1
    

    在某些方面,这与 S4 没有什么不同/不那么古怪

    .B <- setClass("B", representation(x="numeric"))
    
    setValidity("B", function(object) {
        if (length(object@x) != 1)
            "'x' must be length 1"
        else TRUE
    })
    

    > .B()                 # no validity checking!
    An object of class "B"
    Slot "x":
    numeric(0)
    
    > validObject(.B())
    Error in validObject(.B()) : 
      invalid class "B" object: 'x' must be length 1
    > .B(x=1:5)
    Error in validObject(.Object) : 
      invalid class "B" object: 'x' must be length 1
    > b = .B(x=1L)
    > b@x <- 1:5          # no validity checking@!
    > validObject(b)
    Error in validObject(b) : invalid class "B" object: 'x' must be length 1
    

    【讨论】:

    • 谢谢马丁;这是有趣的。注意.B(x=1:2) 会调用有效性方法,但.A(x=1:2) 不会。我想我可以在initialize 方法的末尾添加validObject
    • @BrodieG 是的,或者发帖到R-devel 寻求指导/建议这个功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    相关资源
    最近更新 更多