Claude Skill

r-package-development

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.

LLM Mart · 0 points · 23 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download posit-dev-skills-r-lib_r-package-development-b58a92e.zip · 1 KB
Part of posit-dev/skills — 23 skills

Install

skills CLI npx skills add https://github.com/posit-dev/skills/tree/main/r-lib/r-package-development
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install posit-dev-skills@llmmart
Git git clone https://github.com/posit-dev/skills.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole posit-dev/skills collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

R package development

Key commands

# Run code in the package
Rscript -e "devtools::load_all(); code"

# Run all tests
Rscript -e "devtools::test()"

# Run all tests for files starting with {name}
Rscript -e "devtools::test(filter = '^{name}')"

# Run all tests for R/{name}.R
Rscript -e "devtools::test_active_file('R/{name}.R')"

# Run a single test "blah" for R/{name}.R
Rscript -e "devtools::test_active_file('R/{name}.R', desc = 'blah')"

# Redocument the package
Rscript -e "devtools::document()"

# Check pkgdown documentation
Rscript -e "pkgdown::check_pkgdown()"

# Check the package with R CMD check
Rscript -e "devtools::check()"

# Format code
air 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.
Files (skills)
  • SKILL.md 2.8 KB
    ---
    name: r-package-development
    description: 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.
    metadata:
      author: Simon P. Couch (@simonpcouch)
      version: "1.2"
    ---
    
    # R package development
    
    ## Key commands
    
    ```
    # Run code in the package
    Rscript -e "devtools::load_all(); code"
    
    # Run all tests
    Rscript -e "devtools::test()"
    
    # Run all tests for files starting with {name}
    Rscript -e "devtools::test(filter = '^{name}')"
    
    # Run all tests for R/{name}.R
    Rscript -e "devtools::test_active_file('R/{name}.R')"
    
    # Run a single test "blah" for R/{name}.R
    Rscript -e "devtools::test_active_file('R/{name}.R', desc = 'blah')"
    
    # Redocument the package
    Rscript -e "devtools::document()"
    
    # Check pkgdown documentation
    Rscript -e "pkgdown::check_pkgdown()"
    
    # Check the package with R CMD check
    Rscript -e "devtools::check()"
    
    # Format code
    air 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.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related