R 4.6.0 更新里,哪些变化和科研分析更相关

Update R to 4.6.0: What changes matter for research analysis?
r
update
reproducibility
Author
Published

Friday, May 1, 2026

R 4.6.0 已经在 2026 年 4 月 24 日发布,代号是 Because it was There

我平时看 R 的版本更新,不太会把它当成 必须马上升级 的通知。对大多数医学、生物、公卫方向的科研人员来说,R 的小版本更新通常不是为了追新,而是为了判断三件事:自己的分析脚本会不会受影响,哪些新功能能减少一点重复劳动,以及在教学、论文和项目复现里有没有需要提前注意的地方。

这篇文章不是完整翻译官方 NEWS。R 4.6.0 的更新很多,涉及 C/C++、包开发、图形设备、帮助文档、平台构建等内容。下面我只挑出几个和统计分析、数据整理、科研复现更相关的点,尤其是普通科研使用者可能真的会遇到的变化。

1. 先说结论:这不是一次 界面变了 的更新

R 4.6.0 对日常使用者最直接的变化,不是菜单、界面或某个 IDE 的体验变化,而是一些基础函数、统计函数和包安装机制的细节改进。

我会把这次更新粗略分成五类:

  1. 统计检验和模型诊断相关的变化;
  2. 数据初步查看、文件筛选和日期匹配的改进;
  3. 科研写作与引用 R 本身的变化;
  4. 包安装、包完整性和编译环境相关的变化;
  5. 一些会影响升级判断的兼容性细节。

如果你只是用 RStudio 跑 tidyversesurvivallme4glmtableone 这类常见分析包,这次更新大概率不会让你的工作流 变样。但如果你做方法学、开发内部分析包、维护课程代码,或者经常需要复现旧项目,就值得认真看一下。

2. 非参数检验:wilcox.test() 对 ties 的处理更强了

医学和公卫数据里,wilcox.test() 很常见。比如样本量不大、结局变量明显偏态,或者用秩和检验比较两组分布时,很多人都会用它。

R 4.6.0 的官方 NEWS 提到,wilcox.test() 现在可以在存在 ties 的情况下进行 exact conditional inference,并且可以选择用 Edgeworth series 的修正项来改进渐近 p 值。

这个变化听起来比较技术,但实际含义不难理解。

在真实医学数据里,ties 很常见。比如评分量表、检测下限导致的相同数值、整数化的住院天数、分级变量转成数值后参与比较,都会让很多观测值相同。过去一遇到 ties,很多 exact 检验就会受到限制,软件可能退回渐近近似,或者给出提醒。

这次更新不意味着 以后 Wilcoxon 检验就不用判断前提了。它更像是在常见的 ties 场景里,让基础 R 的实现更完整一些。对教学和小样本分析来说,这是一个值得知道的改进。

我的建议是:如果论文里报告的是 Wilcoxon 检验,仍然要写清楚你使用的 R 版本和函数设置。尤其是小样本、ties 很多、p 值接近阈值时,不同软件、不同版本、不同 exact/asymptotic 选择可能给出略有差别的结果。

3. 新的 free1way():不是替代 ANOVA,而是补充一个更稳健的选择

R 4.6.0 在 stats 包里新增了 free1way()。官方说明把它描述为用于 distribution-free stratified K-sample one-way layouts 的 semiparametrically efficient inference procedure,同时配套了 power.free1way.test()rfree1way()、诊断图和 probability-probability plots。

如果只看这句话,很容易觉得离普通科研很远。换成实际问题,可以这样理解:有些比较问题并不适合简单套一元方差分析,尤其是分布形态、分层结构、非参数推断和样本量设计都需要同时考虑时,R 现在在基础 stats 包里提供了一个新的入口。

不过,我不建议把它写成 ANOVA 的新替代品。对大多数医学论文来说,是否使用它仍然取决于研究问题、数据结构和读者能否理解你的方法。新函数的出现,首先是给统计方法使用者多一个工具,而不是要求所有人马上替换旧分析。

比较适合关注它的人包括:

  • 做非参数方法、秩检验或分布无关推断的人;
  • 经常处理分层多组比较的人;
  • 需要写模拟、功效或样本量评估代码的人;
  • 维护统计课程或方法学示例代码的人。

普通应用研究者可以先知道有这个函数,后续真正用到时再查帮助文档和原始方法背景。不要只因为它是 新函数 就放进论文方法部分。

4. GLM 诊断:影响值和残差的细节更严谨

R 4.6.0 对 glm 对象的影响度量也做了调整。官方 NEWS 提到,weighted.residuals() 现在对 "glm" 对象返回 weighted working residuals;influence.glm() 也同时包含 "wt.res""dev.res"。另外,若干 GLM 的 influence measures 改用 Pearson residuals,而不是 deviance residuals。

这类变化对初学者可能不显眼,因为很多人只是调用:

fit <- glm(y ~ x1 + x2, family = binomial(), data = dat)
summary(fit)

但在真实分析里,GLM 诊断很重要。比如 logistic regression 里是否有异常点、是否有高杠杆观测、某些样本是否明显影响系数估计,这些问题不只影响模型 好不好看,也会影响结果解释的稳定性。

这里需要注意的是,R 4.6.0 的变化可能让某些诊断输出和旧版本略有不同。如果一个项目严格复现了旧论文或旧报告中的影响值诊断结果,最好记录 R 版本,并在升级后重新跑一遍关键诊断图和诊断表。

另一个小变化也和模型有关:confint.default() 现在只要有合适的 coef()vcov() 方法,也可以用于 S4 对象;hatvalues() 新增了对 nls 结果的方法。这些对普通线性模型用户不是大新闻,但对使用 S4 类模型对象、非线性模型或扩展建模包的人,可能会让基础诊断和区间估计更顺手。

5. 数据初筛:summary()%notin%list.files() 都更贴近日常代码

R 4.6.0 里有几处看起来很小,但我觉得对初学者和日常分析很友好。

第一是 summary() 对 character vectors 更有信息量。以前对字符列做 summary(),常常只能看到 LengthClassMode,对实际数据检查帮助有限。现在默认 summary() 可以提供更多字符向量信息,也可以通过 character.method = "factor" 按类似 factor 的方式查看分布。

在医学数据清洗里,这个细节很实用。很多变量从 Excel 或 CSV 读进来以后,一开始都是 character。比如性别、科室、药物名称、检测批次、随访状态。更有信息量的 summary() 可以帮助我们更早发现空字符串、类别数量异常、拼写不一致等问题。

第二是 base R 新增了 %notin%。它等价于:

!(x %in% table)

但更易读:

dat[dat$group %notin% c("control", "case"), ]

我不觉得这会改变统计分析本身,但它能减少一点代码理解成本。对学生来说,! x %in% y 的运算顺序经常让人犹豫,写成 %notin% 更接近自然语言。

第三是 list.files() 新增 fixed 参数,用于把 pattern 当作固定字符串,而不是正则表达式。比如你只是想找文件名里包含 .csv 的文件,就可以写:

list.files(pattern = ".csv", fixed = TRUE)

这对科研项目里的批量读入文件很有帮助。很多错误不是统计方法错了,而是文件匹配错了:本来想匹配后缀 .csv,结果因为正则表达式里的 . 代表任意字符,读入了不该读的文件。fixed = TRUE 至少可以让简单任务少绕一点弯。

6. 日期匹配和一些边角修复:小地方也会影响可复现

官方 NEWS 里还提到,<Date> %in% set 的速度恢复到 R 4.3.0 以前的水平,并且文档更明确地说明了 <character> %in% <Date> 以及反向匹配的行为。

这类变化不是最吸引眼球的更新,但在公卫和临床数据里,日期变量非常常见。入组日期、住院日期、随访日期、检测日期、事件发生日期,都会参与筛选和合并。

如果数据量很小,你可能感觉不到差异。但在大队列或长期随访数据里,日期匹配性能和行为一致性会影响数据处理脚本的稳定性。我的习惯仍然是:在合并或匹配前,尽量显式转换日期类型,不要让 character 和 Date 隐式比较承担太多责任。

类似地,diff() 对 matrix 的返回、as.Date()/as.POSIXlt() 的边界行为、cdplot() 在极低密度区间的修复,这些都不一定每天遇到。但如果你刚好踩到这些边角 bug,版本更新就不是 可有可无 的事情。

7. 论文引用和包安装:和可复现有关的几件事

R 4.6.0 的 citation() 现在给 R 本身提供了 DOI:10.32614/R.manuals。如果你在论文、课题报告或软件说明中引用 R,后续可以更新参考文献格式。

这件事不复杂,但值得提醒学生。很多论文会写一句 All analyses were performed using R version ...,但并不正式引用 R。更规范的做法是同时记录 R 版本、主要包版本,并在需要时使用 citation() 或包的 citation("pkg") 生成引用信息。

包安装方面,R 4.6.0 引入了新的 package integrity verification 和 package signing 机制。简单说,包可以通过 SHA256 文件和 GnuPG 签名来做更可靠的完整性验证。当前这主要影响包维护者、机构内镜像、服务器环境和二进制包分发,不是每个普通用户都会直接操作。

但它提醒我们一件事:科研可复现不只是脚本能跑,还包括包来源、包版本、系统环境是否可追踪。对医院、实验室或课程服务器来说,长期看这类机制会越来越重要。

另外,默认 C++ 标准在可用时改为 C++20;一些旧的 C++11/C++14 指定方式已经不再支持。普通 R 用户通常不会直接处理这些,但如果你安装含 C++ 代码的包,或者在 Windows/macOS 上从源码安装包,升级 R 后遇到编译报错时,需要把这个背景纳入排查。

8. 我会怎么升级

如果是我自己的项目,我不会在一个快要投稿或正在返修的分析项目中,马上把 R 主版本切到 4.6.0 后直接覆盖旧环境。比较稳妥的做法是:

  1. 先保留旧项目环境,尤其是 renv.locksessionInfo()、主要输出表格和图;
  2. 在新 R 版本里单独恢复或重建环境;
  3. 重新跑关键模型、主要表格和敏感性分析;
  4. 对 p 值接近阈值、模型诊断依赖较强、非参数检验较多的部分多看一眼;
  5. 确认无明显差异后,再把新版本用于后续项目。

如果只是学习 R、上课、做新的练习项目,升级到 R 4.6.0 问题不大。新版本的帮助文档、基础函数细节和包安装机制会更接近未来的 R 使用方式。

但如果你维护的是已有论文项目,我更建议把 R 当成科研环境的一部分,而不是一个可以随意替换的编辑器。软件版本不是越新越好,关键是可解释、可复现、可回退。

Takeaways

  1. R 版本更新不只是 有没有新函数,也包括统计函数的边界行为和诊断细节。像 wilcox.test()glm influence measures、summary() 这样的变化,可能会出现在真实论文分析里。

  2. 升级前先问项目处在哪个阶段。新项目可以跟进新版本;正在投稿、返修或复现旧结果的项目,最好保留旧环境,再并行测试新环境。

  3. 科研分析的可复现不仅是保存代码。R 版本、包版本、包来源、引用信息、日期和文件匹配规则,都是分析链条的一部分。R 4.6.0 的很多更新,其实都在提醒我们把这些细节做得更扎实一点。