首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参考类的有效性方法

参考类的有效性方法
EN

Stack Overflow用户
提问于 2015-05-26 02:31:06
回答 1查看 314关注 0票数 2

在S4中,我可能会这样做:

代码语言:javascript
复制
setClass(
  "test", slots=c(a="integer"), 
   validity=function(object) if(length(object@a) != 1L) "not scalar" else TRUE
)

引用类的等效性是什么?在引用类的上下文中,我找不到对有效性函数的任何引用。我必须依赖定义setter类吗?尽管基于引用类文档中的这个注释:

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

看来应该有别的办法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-26 17:04:14

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

代码语言:javascript
复制
.A <- setRefClass("A", fields=list(x="numeric"))

setValidity("A", function(object) {
    if (length(object$x) != 1)
        "'x' must be length 1"
    else TRUE
})

但并不是在可能有用的所有情况下都会调用

代码语言:javascript
复制
> .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没有什么不同/不那么古怪。

代码语言:javascript
复制
.B <- setClass("B", representation(x="numeric"))

setValidity("B", function(object) {
    if (length(object@x) != 1)
        "'x' must be length 1"
    else TRUE
})

使用

代码语言:javascript
复制
> .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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30448518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档