CRAN为何禁止在示例中使用on.exit?提交R包遇合规疑问
CRAN的这条要求是其包审核规范的核心原则之一,背后的合理性可以从这几个角度理解:
杜绝用户环境意外污染:用户运行你的包示例、调用函数后,默认期望自己的R环境(包括
options()配置、绘图参数par()、当前工作目录)和运行前完全一致。要是某个包偷偷修改了options(warn = 2)却没恢复,用户后续自己的代码可能会因为这个设置突然抛出大量警告甚至报错,新手用户根本找不到问题根源。覆盖所有执行场景的鲁棒性:你测试时临时文件能正常删除,是在示例顺利跑完的理想情况,但如果示例中途出错(比如
dbConnect因为系统权限失败),部分清理逻辑可能失效——而环境修改的影响会更持久。比如要是代码里改了工作目录没恢复,哪怕示例报错终止,用户的工作目录也会停留在临时路径,后续操作全乱套。CRAN要求用on.exit恢复,就是确保不管代码成功还是失败,都能把用户环境还原回去。维护CRAN生态的统一可信性:CRAN作为官方仓库,需要所有包遵循一致的行为准则。用户安装任何CRAN包,都不用担心里面的代码会悄悄改动自己的环境,这种一致性能大幅降低用户的调试成本,也让整个生态更可靠。
适配自动化检查流程:CRAN的自动审核系统会批量测试上千个包,统一的环境规则能避免包与包之间的环境污染导致误报。比如一个包修改了
par(mar)没恢复,后续其他包的绘图测试就可能因为参数异常失败,打乱整个检查流程。
你的临时文件代码本身并没有修改用户的options/par/工作目录,但CRAN的回复是通用规范提醒,确保你的包所有代码(包括未来的迭代修改)都严格遵循这个原则,避免潜在的环境污染风险。
内容的提问来源于stack exchange,提问作者Neal Fultz

