用途
本技能是一份 R 语言面向对象编程(OOP)指南,覆盖 S7、S3、S4 与 vctrs 四套体系,主要用途是在设计 R 类或为项目选择 OOP 系统时提供决策依据。
主要能力
选型决策树
资料按“你在构建什么”给出分支判断:
- 向量型对象(行为类似原子向量的对象):使用 vctrs。适用条件包括需要数据框集成(列/行)、类型稳定的向量运算、构建类因子/类日期/类数值的类、需要一致的强制转换(coercion/casting)行为、与既有 tidyverse 基础设施协作。示例包括自定义日期类、单位、分类数据。
- 通用对象(复杂数据结构,非向量型):优先 S7,适用于需要形式化类的新项目、需要属性校验与安全属性访问(@)、需要超出 S3 双重分派的多分派、希望从 S3 转换并获得更好结构、构建带继承的类层次、希望有更好的错误信息与可发现性。
- 简单类:使用 S3,适用于结构需求极少的简单类、需要最大兼容性与最少依赖、快速原型或内部类、参与既有 S3 生态、性能绝对关键(开销最小)。
- S4:适用于 Bioconductor 生态、需要复杂多继承(S7 不支持)、已有运行良好的 S4 代码库。
S7 与 S3 对比
资料以表格列出差异:类定义上 S3 为非正式(约定)、S7 为正式(new_class());属性访问上 S3 用 $ 或 attr()(不安全),S7 用 @(安全、带校验);校验上 S3 手动且不一致,S7 内置校验器;方法发现上 S3 较难找到方法,S7 方法打印清晰;多分派上 S3 有限(基础泛型),S7 支持完整多分派;继承上 S3 为非正式、用 NextMethod(),S7 显式使用 super();迁移成本上 S7 较低(1-2 小时);性能上 S3 最快,S7 与 S3 大致相当、差异可忽略;兼容性上 S7 兼容完整 S3。
实践指南
资料给出各类选择下对应的代码片段:S7 的校验器、多分派与继承写法;vctrs 的向量型行为、类型稳定运算与显式转换;S3 的简单类构造与 print 方法。
S3 模式
包括构造器(stopifnot 做输入检查 + structure 设置 class)、print 方法(print.person)、泛型与方法(UseMethod、greet.person、greet.default),以及继承写法(子类在 class 向量前置子类名,子类方法中用 NextMethod() 调用父类方法)。
S7 模式
包括:加载 S7 后用 new_class() 定义类,properties 中声明 name = class_character、age = class_numeric,validator 中校验 @age 非负;用构造器创建实例并通过 @ 读写属性(赋值自动校验);用 new_generic() 定义泛型、method() 注册方法(含 class_any 默认方法);用 parent = Person 实现继承并在子类方法中用 super(x, Person)@greet() 调用父类方法;用 new_generic("combine", c("x", "y")) 实现多分派,并按 list(Person, Person)、list(Person, class_character) 注册方法。
迁移策略
S3 迁移到 S7 通常为 1-2 小时工作且保持完整兼容;S4 迁移到 S7 更复杂,需评估是否真的需要 S4 特性;Base R 迁移到 vctrs 对向量型类收益显著;组合方式上 S7 类可在内部使用 vctrs 原则。资料给出 S3 到 S7 的迁移示例,并说明 S7 向后兼容 S3 泛型,既有 S3 方法仍可工作。
何时不应使用 OOP
资料提醒:不要为简单数据建类,如点坐标可用命名向量 c(x = 1.5, y = 2.3);不要为一次性操作建类,改用函数,例如用 distance() 函数计算两点距离。
使用方式
本资料未提供该技能的具体调用方式、安装命令或运行环境说明。上述内容为技能本身涵盖的 R OOP 选型指导与示例代码。
适用场景
- 新建 R 包或类库时在 S7、S3、S4、vctrs 之间做选型。
- 维护既有 S3 或 S4 代码,评估迁移到 S7 的成本与收益。
- 为已有类补充属性校验、安全访问与更清晰的错误信息。
- 构建需要数据框集成与类型稳定运算的向量型类。
限制
- 资料未说明该技能对 R 版本、S7 包版本或运行环境的要求,暂未提供。
- S4 部分仅说明使用场合,未展开代码示例。
- vctrs 部分仅给出少量示例,未给出完整模式说明。
- 资料未说明该技能的具体使用入口与调用方法,暂未提供。