SuperAPI AI 工具集

r-package-development

编程与开发

查看项目

更新于 10-15 08:14

技能介绍

用途

本技能是一份 R 包开发决策指南,面向正在开发 R 包的开发者,围绕依赖、API 设计、测试、文档和最佳实践提供判断依据与代码示例。

主要能力

依赖策略

指南给出何时添加依赖、何时使用 base R 的判断标准:当能带来显著功能增益、减少维护负担、改善用户体验,或涉及复杂实现(正则、日期、网络)时,可考虑添加依赖;对于简单工具函数、将被广泛使用的包(应尽量减少依赖)、收益与体积不匹配的大型依赖,或 base R 已有直接解法时,应使用 base R。

示例判断包括:str_detect(x, "pattern") 值得引入 stringr;length(x) > 0 不需要 purrr;parse_dates(x) 值得引入 lubridate;x + 1 不需要 dplyr。

对 tidyverse 依赖给出分层建议:核心 tidyverse(dplyr、purrr、stringr、tidyr)通常值得引入;专用 tidyverse(lubridate、forcats、readr、ggplot2)需谨慎评估;重型依赖(tidyverse 元包、shiny)应尽量少用。

DESCRIPTION 中的依赖声明区分 Imports(必需)、Suggests(可选)、Enhances(可选但可用时加载)。

API 设计模式

现代 tidyverse API 模式包括:使用 .by 进行按操作分组;使用 {{ }} 处理用户提供的列;使用 ... 提供灵活参数;返回一致类型(tibble 而非 data.frame)。

输入校验按函数类型分级:面向用户的函数进行全面校验;内部函数做最小校验(假定输入有效,仅检查关键不变量);使用 vctrs 的函数可做类型稳定的校验(如 vec_cast)。

错误处理模式强调错误信息具体且可操作,使用 cli 生成用户友好消息、rlang 提供开发者工具,并可在错误中包含函数名。指南还介绍自定义错误类,用于程序化处理,例如定义 my_package_error、validation_error 等类。

内部函数与导出函数

导出函数的场景:用户会直接调用、其他包可能扩展、属于核心功能、API 稳定不常变动。内部函数的场景:属于可能变化的实现细节、仅在包内使用、复杂实现辅助、会干扰用户 API。内部函数命名约定以 . 前缀,如 .compute_metrics。

测试与文档

测试层级包括单元测试(单个函数)、集成测试(工作流组合)、基于属性的测试。测试文件组织示例:test-validation.R、test-processing.R、test-output.R、test-integration.R、helper-fixtures.R,以及 testthat.R 运行器。快照测试用于难以精确指定的复杂输出和错误消息。

文档优先级:必须记录所有导出函数、复杂算法或公式、不明显的参数交互、典型用法示例;可跳过简单内部辅助函数、显而易见的参数含义、仅调用其他函数的函数。指南给出 roxygen2 文档示例,包含 @description、@param、@return、@examples、@export 等标签。

包结构与发布

推荐目录布局包含 DESCRIPTION、NAMESPACE、LICENSE、README.md、R/(utils、validation、core、methods、zzz)、man/、tests/、vignettes/、inst/extdata/、data/、data-raw/。DESCRIPTION 最佳实践示例涵盖 Package、Title、Version、Authors@R、Description、License、Encoding、Roxygen、Imports、Suggests、Config/testthat/edition 等字段。

发布清单包括:devtools::check() 需 0 错误、0 警告、0 提示;devtools::test() 全部通过;devtools::document() 文档最新;urlchecker::url_check() 检查 URL;spelling::spell_check_package() 检查拼写;使用 usethis::use_version() 更新版本;更新 NEWS.md;最后执行 devtools::check(remote = TRUE, manual = TRUE)。

常见错误

避免在包代码中使用 library(),应使用命名空间限定(如 dplyr::filter)或通过 roxygen2 的 @importFrom 导入;避免修改全局状态,如必须修改需用 on.exit 恢复;避免硬编码路径,应使用 system.file() 读取包内数据。

使用方式

该技能以参考指南形式提供,在开发 R 包时按需查阅相应章节,依据其中的判断标准和代码示例进行决策。资料未提供具体的安装命令或调用命令。

适用场景

适用于 R 包的依赖取舍、API 设计、输入校验与错误处理、测试组织、文档编写、目录结构搭建和发布前检查等开发环节。

限制

资料未说明该技能的运行环境要求、版本兼容范围或与其他工具的集成方式。