R语言引用类如何正确定义units类型字段?
解决R引用类中使用units对象作为字段的问题
问题原因
units包的units对象属于S4类,而R引用类(Reference Classes)默认的字段类型检查逻辑无法直接识别未明确标记的S4类,因此直接指定fields = list(units_value = "units")会报错。
解决方案
方案1:使用S4类标记直接指定字段类型
通过methods::S4("units")明确告知引用类该字段是S4类型的units对象,前提是已经加载units包:
library(units) MyClass <- setRefClass( "MyClass", fields = list(units_value = methods::S4("units")) ) # 测试代码 uv <- units::as_units(10, 'cm') mc <- MyClass(units_value = uv) mc$units_value
方案2:用ANY类型配合初始化验证
将字段设为"ANY",然后在引用类的initialize方法中添加类型校验,确保赋值的是units对象:
library(units) MyClass <- setRefClass( "MyClass", fields = list(units_value = "ANY"), methods = list( initialize = function(units_value, ...) { if (!inherits(units_value, "units")) { stop("units_value必须是units类对象") } callSuper(units_value = units_value, ...) } ) ) # 测试代码 uv <- units::as_units(10, 'cm') mc <- MyClass(units_value = uv) mc$units_value
方案对比
- 方案1更简洁,直接利用引用类对S4类的支持,无需额外编写校验逻辑;
- 方案2灵活性更高,可在初始化时添加更多自定义逻辑(如单位校验等)。
内容的提问来源于stack exchange,提问作者Canadian_Marine
相关产品推荐
相关产品推荐

