R语言中如何实现精准区分类与继承类的判断函数?
区分R对象的直接类与继承类
当用class(x) == "character"这类代码检查对象类时,R CMD check会提示改用inherits()或is(),但这两个函数会把继承类也纳入判断范围——比如你示例中,子类classBBB的对象sss会同时被判定属于基类classAAA和自身类classBBB,无法区分“继承自某类”和“本身就是该类实例”的情况。
要实现你需要的foo()函数,核心逻辑是:判断对象是否继承自指定类,同时排除“对象本身就是该类直接实例”的情况。以下是实现代码:
foo <- function(obj, class_name) { is(obj, class_name) && !identical(class(obj)[1], class_name) }
测试验证
结合你的示例代码进行测试:
# 创建基类 setClass("classAAA", slots = list(aaa = "numeric") ) # 创建继承类 setClass("classBBB", slots = list(bbb = "character"), contains = "classAAA" ) # 创建子类对象 sss <- new("classBBB", aaa = 21, bbb="India") show(sss) # 原有函数的判断结果 inherits(sss,"classAAA") # 返回 TRUE inherits(sss,"classBBB") # 返回 TRUE is(sss,"classAAA") # 返回 TRUE is(sss,"classBBB") # 返回 TRUE # 自定义foo函数的判断结果 foo(sss, "classAAA") # 返回 TRUE foo(sss, "classBBB") # 返回 FALSE
代码说明
is(obj, class_name):遵循R的规范,安全判断对象是否继承自目标类,符合R CMD check的要求;class(obj)[1]:获取对象的直接类(对于S4对象,class()返回的第一个元素就是其直接定义的类);!identical(...):确保直接类不等于目标类,从而精准区分“继承关系”和“直接实例”。
内容的提问来源于stack exchange,提问作者Hausdorff
相关产品推荐
相关产品推荐

