首页 > 解决方案 > 防止将类属性设置为元素

问题描述

尝试将类属性设置为不满足特定条件的元素时,如何能够引发错误?

例如,我们看到当我们有任何 mode 对象时list,我们不能将其 class 属性设置为factor。IE

a <- as.list(1:3)
class(a) <- "factor"
Error in class(a) <- "factor" : 
  adding class "factor" to an invalid object

我需要将同样的想法复制到my_class课堂上。我不希望它在列表上工作。IE

a <- as.list(1:3)
class(a) <-"my_class" # SHOULD THROW AN ERROR
attr(a, "class") <- "my_class" # SHOULD THROW AN ERROR.

我如何在 R 中做到这一点?谢谢

标签: rclass

解决方案


这在 S3 类系统中是不可能的。这些对一些基本 S3 类的特殊检查是在 R 的 C 代码中实现的,目前无法将它们扩展到其他 S3 类。如果您需要强制执行对象类型并且不想向所有方法添加断言,我建议您切换到 S4 类:

constructor <- setClass("my_class", slots = c(x="numeric"))
y <- constructor(x = as.list(1:3))
#Error in validObject(.Object) : 
#  invalid class “my_class” object: invalid object for slot "x" in class "my_class": got class "list", should be or extend class "numeric"

y <- constructor(x = 1:3)
y
#An object of class "my_class"
#Slot "x":
#[1] 1 2 3

推荐阅读