R Package Development

posit-dev/skills/r-lib/r-package-development

by posit-deve20b71b2ab527b7c480f4f60dcce2b18df1a99aeNo licenseListed Oct 9, 2026Updated Oct 9, 2026

R package development with devtools, testthat, and roxygen2. Use when the user is working on an R package, running tests, writing documentation, or building package infrastructure.

Instructions onlySoftware Development
AI-generated overview

Conventions and commands for developing R packages with devtools, testthat and roxygen2.

What it does
Provides a set of R commands for loading package code, running tests, regenerating documentation, checking pkgdown sites and running R CMD check. It also states coding, testing, documentation and NEWS.md conventions, including test file placement, snapshot expectations, roxygen wrapping and changelog bullet ordering. The deliverable is guidance applied to an existing or new R package rather than a generated artifact.
When to use it
Use when working on an R package and needing to run its tests, document functions, check the package or follow project conventions. Also useful when adding new code, tests, roxygen documentation or NEWS.md entries to a package.
Requirements
Requires an R runtime with the devtools, testthat, roxygen2 and pkgdown packages, plus the air formatter. No scripts ship with the skill; it is instructions only.

R package development

Key commands

# Run code in the packageRscript -e "devtools::load_all(); code"
# Run all testsRscript -e "devtools::test()"
# Run all tests for files starting with {name}Rscript -e "devtools::test(filter = '^{name}')"
# Run all tests for R/{name}.RRscript -e "devtools::test_active_file('R/{name}.R')"
# Run a single test "blah" for R/{name}.RRscript -e "devtools::test_active_file('R/{name}.R', desc = 'blah')"
# Redocument the packageRscript -e "devtools::document()"
# Check pkgdown documentationRscript -e "pkgdown::check_pkgdown()"
# Check the package with R CMD checkRscript -e "devtools::check()"
# Format codeair format .

Coding

  • Always run air format . after generating code.
  • Use the base pipe operator (|>) not the magrittr pipe (%>%).
  • Use \() ... for single-line anonymous functions. For all other cases, use function() {...}.

Testing

  • Tests for R/{name}.R go in tests/testthat/test-{name}.R.
  • All new code should have an accompanying test.
  • If there are existing tests, place new tests next to similar existing tests.
  • Strive to keep tests minimal with few comments.
  • Avoid expect_true() and expect_false() in favour of a specific expectation which will give a better failure message.
  • When testing errors and warnings, don't use expect_error() or expect_warning(). Instead, use expect_snapshot(error = TRUE) for errors and expect_snapshot() for warnings because these allow the user to review the full text of the output.

Documentation

  • Every user-facing function should be exported and have roxygen2 documentation.
  • Wrap roxygen comments at 80 characters.
  • Internal functions should not have roxygen documentation.
  • Whenever you add a new (non-internal) documentation topic, also add the topic to _pkgdown.yml.
  • Always re-document the package after changing a roxygen2 comment.
  • Use pkgdown::check_pkgdown() to check that all topics are included in the reference index.

NEWS.md

  • Every user-facing change should be given a bullet in NEWS.md. Do not add bullets for small documentation changes or internal refactorings.
  • Each bullet should briefly describe the change to the end user.
  • If the change is related to a function, put the name of the function early in the bullet.
  • If the bullet is related to a GitHub issue or pull request, reference it by number in parentheses before the final period: (#123)..
  • Order bullets alphabetically by function name. Put all bullets that don't mention function names at the beginning.

Source and attribution

Source:posit-dev/skillsinr-lib/r-package-developmentat commite20b71b

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal