旧R包PIMixture因class(x)返回matrix和array报错,是否为新问题?
旧R包PIMixture的
class()判断报错原因解析 核心成因
- R版本更新导致类返回值变化:早期R版本中,矩阵对象的
class()仅返回"matrix";后续R版本调整了类的继承机制,矩阵同时属于"matrix"和"array"类,因此class(mat2)会返回长度为2的向量["matrix", "array"]。 - 旧包代码的逻辑缺陷:PIMixture包开发时依赖了早期R的
class()返回单值的特性,源码中使用if (class(mat2) == "numeric")这类判断。当class()返回多元素向量时,==会生成长度>1的逻辑向量,而if语句要求条件必须是长度为1的逻辑值,直接触发报错。
验证与临时修复
你排查到的class(mat2)返回["matrix", "array"]是准确的,临时修改为class(mat2)[1]可以绕过问题,但更规范的写法是用inherits(mat2, "numeric")——这个函数会检查对象是否继承目标类,不受多类名返回的影响,能从根源避免这类版本兼容问题。
报错复现代码
> library(PIMixture) > data(PIdata) > model<-"C_CIN3PLUS+L_CIN3PLUS+R_CIN3PLUS~RES_HPV16" > fit1<-PIMixture(p.model=model,data=PIdata1, model="logistic-Weibull") Error in if (class(mat2) == "numeric") { : the condition has length > 1 }
内容的提问来源于stack exchange,提问作者tomka
相关产品推荐
相关产品推荐

