write-roxygen-docs
关于
This Claude Skill generates comprehensive roxygen2 documentation for R packages, covering functions, datasets, classes, and methods while following tidyverse style. It handles standard tags, cross-references, examples, and NAMESPACE entries automatically. Use it when documenting new exports, internal helpers, or fixing R CMD check notes related to documentation.
快速安装
Claude Code
推荐npx skills add pjt222/agent-almanac -a claude-code/plugin add https://github.com/pjt222/agent-almanacgit clone https://github.com/pjt222/agent-almanac.git ~/.claude/skills/write-roxygen-docs在 Claude Code 中复制并粘贴此命令以安装该技能
技能文档
Write Roxygen Docs
Complete roxygen2 docs → R fns, datasets, classes.
Use When
- New exported fn → docs
- Internal helper fns
- Pkg datasets
- S3/S4/R6 classes + methods
- Fix doc-related
R CMD checknotes
In
- Required: R fn|dataset|class to doc
- Optional: Related fns → cross-ref (
@family,@seealso) - Optional: Export fn?
Do
Step 1: Fn Docs
Roxygen comments directly above fn:
#' Compute the weighted mean of a numeric vector
#'
#' Calculates the arithmetic mean of `x` weighted by `w`. Missing values
#' in either `x` or `w` are handled according to the `na.rm` parameter.
#'
#' @param x A numeric vector of values.
#' @param w A numeric vector of weights, same length as `x`.
#' @param na.rm Logical. Should missing values be removed? Default `FALSE`.
#'
#' @return A single numeric value representing the weighted mean.
#'
#' @examples
#' weighted_mean(1:5, rep(1, 5))
#' weighted_mean(c(1, 2, NA, 4), c(1, 1, 1, 1), na.rm = TRUE)
#'
#' @export
#' @family summary functions
#' @seealso [stats::weighted.mean()] for the base R equivalent
weighted_mean <- function(x, w, na.rm = FALSE) {
# implementation
}
Got: Complete roxygen w/ title, desc, @param per param, @return, @examples, @export.
If err: Unsure tag → ?roxygen2::rd_roclet. Common omission @return → CRAN required for all exports.
Step 2: Essential Tags
| Tag | Purpose | Required for export? |
|---|---|---|
#' Title | First line, one sentence | Yes |
#' Description | Paragraph after blank line | Yes |
@param | Parameter documentation | Yes |
@return | Return value description | Yes (CRAN) |
@examples | Usage examples | Strongly recommended |
@export | Add to NAMESPACE | Yes, for public API |
@family | Group related functions | Recommended |
@seealso | Cross-references | Optional |
@keywords internal | Mark as internal | For non-exported docs |
Got: Required tags ID'd. Exports have @param, @return, @examples, @export minimum.
If err: Tag unfamiliar → roxygen2 docs for usage + syntax.
Step 3: Doc Datasets
Create R/data.R:
#' Example dataset of city temperatures
#'
#' A dataset containing daily temperature readings for major cities.
#'
#' @format A data frame with 365 rows and 4 variables:
#' \describe{
#' \item{date}{Date of observation}
#' \item{city}{City name}
#' \item{temp_c}{Temperature in Celsius}
#' \item{humidity}{Relative humidity percentage}
#' }
#' @source \url{https://example.com/data}
"city_temperatures"
Got: R/data.R has roxygen blocks per dataset w/ @format describing structure + @source for provenance.
If err: R CMD check warns undocumented dataset → ensure quoted string ("city_temperatures") exactly matches obj name saved w/ usethis::use_data().
Step 4: Doc Pkg
Create R/packagename-package.R:
#' @keywords internal
"_PACKAGE"
## usethis namespace: start
## usethis namespace: end
NULL
Got: R/packagename-package.R exists w/ @keywords internal + "_PACKAGE" sentinel. devtools::document() generates man/packagename-package.Rd.
If err: R CMD check reports missing pkg doc page → verify file R/<packagename>-package.R + contains "_PACKAGE".
Step 5: Special Cases
Fns w/ dots in names (S3 methods):
#' @export
#' @rdname process
process.myclass <- function(x, ...) {
# S3 method
}
Reuse docs w/ @inheritParams:
#' @inheritParams weighted_mean
#' @param trim Fraction of observations to trim.
trimmed_mean <- function(x, w, na.rm = FALSE, trim = 0.1) {
# implementation
}
No visible binding fix w/ .data pronoun:
#' @importFrom rlang .data
my_function <- function(df) {
dplyr::filter(df, .data$column > 5)
}
Got: Special cases (S3 methods, inherited params, .data pronoun) documented correctly. @rdname groups S3 methods. @inheritParams reuses params w/o duplicate.
If err: R CMD check warns "no visible binding for global variable" → #' @importFrom rlang .data or utils::globalVariables() last resort.
Step 6: Generate Docs
devtools::document()
Got: man/ updated w/ .Rd files per documented obj. NAMESPACE regenerated w/ correct exports + imports.
If err: Roxygen syntax errs. Common: unclosed brackets in \describe{}, missing #' prefix, invalid tag names. Re-run devtools::document() after fix.
Check
- Every exported fn has
@param,@return,@examples -
devtools::document()runs no errs -
devtools::check()no doc warnings -
@familytags group correctly - Examples run no errs (
devtools::run_examples())
Traps
- Missing
@return: CRAN requires all exports doc return value - Examples need internet/auth: Wrap
\dontrun{}w/ comment why - Slow examples:
\donttest{}for examples that work but slow for CRAN - Markdown in roxygen: Enable
Roxygen: list(markdown = TRUE)in DESCRIPTION - Forget
devtools::document(): Man pages generated, not hand-written
→
create-r-package— initial pkg setup including roxygen configwrite-testthat-tests— test fns you docwrite-vignette— long-form docs beyond fn refsubmit-to-cran— doc requirements for CRAN
GitHub 仓库
相关推荐技能
content-collections
元Content Collections 是一个 TypeScript 优先的构建工具,可将本地 Markdown/MDX 文件转换为类型安全的数据集合。它专为构建博客、文档站和内容密集型 Vite+React 应用而设计,提供基于 Zod 的自动模式验证。该工具涵盖从 Vite 插件配置、MDX 编译到生产环境部署的完整工作流。
polymarket
元这个Claude Skill为开发者提供完整的Polymarket预测市场开发支持,涵盖API调用、交易执行和市场数据分析。关键特性包括实时WebSocket数据流,可监控实时交易、订单和市场动态。开发者可用它构建预测市场应用、实施交易策略并集成实时市场预测功能。
creating-opencode-plugins
元该Skill帮助开发者创建OpenCode插件,用于接入命令、文件、LSP等25+种事件。它提供了插件结构、事件API规范和JavaScript/TypeScript实现模式,适合需要拦截操作、扩展功能或自定义事件处理的场景。开发者可通过它快速构建响应式模块来增强OpenCode AI助手的能力。
sglang
元SGLang是一个专为LLM设计的高性能推理框架,特别适用于需要结构化输出的场景。它通过RadixAttention前缀缓存技术,在处理JSON、正则表达式、工具调用等具有重复前缀的复杂工作流时,能实现极速生成。如果你正在构建智能体或多轮对话系统,并追求远超vLLM的推理性能,SGLang是理想选择。
