R中coxph对象预测:predict与predict.coxph的差异及相关疑问
关于survival包predict.coxph未导出的疑问解答
1. stats包的predict如何识别coxph对象,是否调用predict.coxph?
R中的predict是S3泛型函数,它会根据传入对象的类自动匹配对应的方法。当你传入coxph类的模型对象时,R会查找并调用survival包为该类注册的predict.coxph方法——也就是那个未导出的内部函数。这就是直接调用predict(coxph.obj)和手动调用survival:::predict.coxph(coxph.obj)结果完全一致的原因,二者本质上执行的是同一个函数。
你可以通过methods(predict)查看所有注册的predict方法,或用getS3method("predict", "coxph")确认该方法的来源,会发现它指向survival包的内部环境。
2. 为何predict.coxph不被导出,使用survival:::predict.coxph是否存在问题?
- 未导出的原因:survival包开发者将
predict.coxph设为内部函数,是为了引导用户通过泛型predict()接口使用功能,而非直接调用底层方法。这样开发者可以在不破坏用户代码的前提下,灵活修改内部实现细节。 - 直接调用的风险:
survival:::predict.coxph属于包的非公开API,这类函数没有向后兼容性承诺。如果未来survival包更新时调整了该函数的参数、逻辑甚至名称,你的代码会直接报错。此外,绕过命名空间调用内部函数不符合R包开发规范(CRAN对包的依赖有严格要求,禁止依赖未导出函数)。
验证代码及结果
library(survival) # 加载数据并构造预测变量 myeloma <- myeloma myeloma$x1 <- rnorm(nrow(myeloma), 0, 1) # 拟合Cox比例风险模型 coxph.obj <- coxph(Surv(futime, death) ~ x1, data = myeloma) # 通过泛型predict生成线性预测器 coxph.pred1 <- predict(coxph.obj, type = "lp") # 直接调用未导出的内部函数(不推荐) coxph.pred4 <- survival:::predict.coxph(coxph.obj, type = "lp") # 验证两组预测结果完全一致 sum(coxph.pred1 != coxph.pred4) # 输出0 # 以下两种调用方式会报错(函数未导出) # coxph.pred2 <- predict.coxph(coxph.obj, type = "lp") # coxph.pred3 <- survival::predict.coxph(coxph.obj, type = "lp")
错误信息说明
- 直接调用
predict.coxph()报错:该函数不在全局环境,也未被包导出,R无法找到它。 - 用
survival::predict.coxph()报错:::仅能访问包中导出的公开对象,未导出函数无法通过这种方式调用。
内容的提问来源于stack exchange,提问作者AP30
相关产品推荐
相关产品推荐

