我正在构建一个包来处理多达 4 种不同类型的数据。这些类型中的每一种都是矩阵、data.frame 或树形式的合法类。根据处理数据的方式和其他实验因素,其中一些数据组件可能会丢失,但能够将此信息存储为特殊类的实例并具有识别不同组件的方法仍然非常有用数据。
方法一:
我已经尝试过一种看起来像嵌套树的增量继承结构,其中每种数据类型组合都有自己明确定义的类。这似乎很难在未来扩展额外的数据类型,并且对于新开发人员来说学习所有类名也是一个挑战,无论这些名称组织得多么好。
方法二:
第二种方法是创建一个包含所有 4 种数据类型的插槽的“主类”。为了让缺失数据的实例的槽为 NULL,似乎有必要首先在NULL
类和新数据类型类之间定义一个虚拟类联合,然后使用虚拟类联合作为相关的预期类进入大师班。这是一个示例(假设每个数据类型类都已定义):
################################################################################
# Use setClassUnion to define the unholy NULL-data union as a virtual class.
################################################################################
setClassUnion("dataClass1OrNULL", c("dataClass1", "NULL"))
setClassUnion("dataClass2OrNULL", c("dataClass2", "NULL"))
setClassUnion("dataClass3OrNULL", c("dataClass3", "NULL"))
setClassUnion("dataClass4OrNULL", c("dataClass4", "NULL"))
################################################################################
# Now define the master class with all 4 slots, and
# also the possibility of empty (NULL) slots and an explicity prototype for
# slots to be set to NULL if they are not provided at instantiation.
################################################################################
setClass(Class="theMasterClass",
representation=representation(
slot1="dataClass1OrNULL",
slot2="dataClass2OrNULL",
slot3="dataClass3OrNULL",
slot4="dataClass4OrNULL"),
prototype=prototype(slot1=NULL, slot2=NULL, slot3=NULL, slot4=NULL)
)
################################################################################
所以这个问题可以改写为:
这些方法是否有更有效和/或更灵活的替代方案?
这个例子是从一个关于将 slot 的默认值设置为 NULL的 SO question 的答案修改而来的。这个问题的不同之处在于,我有兴趣了解 R 中创建具有在需要时可以为空的插槽的类的最佳选项,尽管在所有其他非空情况下都需要特定的复杂类。