rpkgkit provides utilities for creating and maintaining R packages.
The functions support common development tasks such as managing
standalone scripts, maintaining NEWS.md, modernizing R source,
configuring package infrastructure, and maintaining README files.
Most functions detect the active file context in RStudio and Positron (2026.10.1 or later), so a file path can often be omitted.
Install the released version from CRAN:
install.packages("rpkgkit")Install the development version from r-universe:
install.packages(
"rpkgkit",
repos = c("https://wanglabcsu.r-universe.dev", "https://cloud.r-project.org")
)Or install from GitHub (recommended):
pak::pak("WangLabCSU/rpkgkit")Detailed, copy-ready examples are organized by task in the package website:
- rpkgkit standalone scripts: import standalone helpers, manage their metadata, and discover or create standalone files.
- Code Convertion: qualify package calls, check source code, modernize syntax, and convert integer or non-ASCII literals.
- Edit NEWS:
create, update, display, and validate
NEWS.mdentries. - Package Setup & Maintenace: configure package infrastructure, vendor permissively licensed code, and manage ignore files.
- Tools for README & Documentation: create README translations and insert or generate badges.
It’s recommended to use following packages together with rpkgkit:
pkgdown/pkgdown.offline: generate package website.pkgload: load package source code.flir/jarl/lintr: lint and fix source code.air: format source code.usethis: manage package metadata.devtools: build and check package.
| Function | Quick usage | Purpose |
|---|---|---|
add_double_colons() |
add_double_colons(code) |
Add pkg:: qualifiers to calls in a code string |
make_func_call_explicit() |
make_func_call_explicit("R/foo.R") |
Add pkg:: qualifiers to every call in one file |
package_func_call_explicit() |
package_func_call_explicit() |
Same, for every file under R/ |
make_func_arg_explicit() |
make_func_arg_explicit("R/foo.R") |
Add argument names to calls in one file |
package_func_arg_explicit() |
package_func_arg_explicit() |
Same, for every file under R/ |
rename_func() |
rename_func("R/foo.R", style = "snake_case") |
Rename function definitions to a naming style |
convert_func_syntax() |
convert_func_syntax("R/foo.R", direction = "to_lambda") |
Switch between function() and \() syntax |
convert_pipe() |
convert_pipe("R/foo.R", direction = "to_base") |
Switch between the magrittr and base pipes in one file |
package_convert_pipe() |
package_convert_pipe(direction = "to_base") |
Same, for every file under R/ |
convert_int_literals() |
convert_int_literals("R/foo.R") |
Add the integer L suffix in one file |
package_convert_int_literals() |
package_convert_int_literals() |
Same, for every file under R/ |
convert_nonascii_code() |
convert_nonascii_code(code, reverse = FALSE) |
Escape non-ASCII characters (or restore them) |
convert_knitr_chunk_header() |
convert_knitr_chunk_header() |
Modernize knitr chunk headers in .Rmd files |
optimize_rmd_yaml() |
optimize_rmd_yaml("README.Rmd") |
Fill one YAML header from the package DESCRIPTION |
package_optimize_rmd_yaml() |
package_optimize_rmd_yaml() |
Same, for README.Rmd and all vignettes |
detect_print_and_cat() |
detect_print_and_cat("R/foo.R", fix = TRUE) |
Find (and fix) CRAN-unsafe print() and cat() calls |
package_print_and_cat() |
package_print_and_cat(fix = TRUE) |
Same, across R/ and tests/testthat/ |
detect_lost_glue_brace() |
detect_lost_glue_brace("R/foo.R") |
Find lost braces in glue and cli strings |
package_lost_glue_brace() |
package_lost_glue_brace() |
Same, across R/ and tests/testthat/ |
detect_unmatched_nocov_marker() |
detect_unmatched_nocov_marker("R/foo.R") |
Find unmatched # nocov markers in one file |
package_unmatched_nocov_marker() |
package_unmatched_nocov_marker() |
Same, across R/ |
detect_fn_arg_path() |
detect_fn_arg_path("R/foo.R") |
Find default path or file arguments in exported functions |
package_fn_arg_path() |
package_fn_arg_path() |
Same, across exported functions of the package |
check_pkgdown_reference() |
check_pkgdown_reference() |
Check that every export appears in _pkgdown.yml |
check_sysdeps() |
check_sysdeps(c("libpng-dev")) |
Check whether system libraries are installed |
check_air_installed() |
check_air_installed() |
Check that the air formatter is on the PATH |
flir_fix() |
flir_fix("R/foo.R") |
Fix R code with flir |
use_air_table() |
use_air_table("R/foo.R", ncol = 3) |
Lay out long c() and list() calls as aligned tables with air |
air_format() |
air_format("R/foo.R") |
Deprecated; format R code with air |
| Function | Quick usage | Purpose |
|---|---|---|
news_md_add_entry() |
news_md_add_entry("Added a new feature.", category = "NEW FEATURES") |
Add an entry, creating the version section when needed |
news_md_show() |
news_md_show(version = "latest") |
Print NEWS.md, optionally filtered to one version |
news_md_check() |
news_md_check() |
Deprecated; validate the NEWS.md format |
| Function | Quick usage | Purpose |
|---|---|---|
use_zzz() |
use_zzz() |
Create R/<pkg>-package.R from a template |
use_r_v4.1.0() |
use_r_v4.1.0() |
Add R (>= 4.1.0) to Depends |
use_url() |
use_url() |
Set URL from the git remote, plus an optional pkgdown URL |
use_bugreports() |
use_bugreports() |
Set BugReports from the git remote |
use_vendor() |
use_vendor("wurli/pedant", "R/utils.R") |
Vendor permissively licensed code from GitHub |
add_global_rbuildignore() |
add_global_rbuildignore() |
Add the global .Rbuildignore patterns |
add_global_gitgnore() |
add_global_gitgnore() |
Add a GitHub-style global .gitignore |
use_jarl() |
use_jarl() |
Create a jarl.toml configuration |
use_clangd() |
use_clangd() |
Create a .clangd configuration with Rcpp include paths |
use_tidy_addin() |
use_tidy_addin("my_addin", "Open my gadget") |
Register an exported function in the RStudio Addins menu |
use_workflow_version_update() |
use_workflow_version_update() |
Add the version-bumper GitHub Actions workflow |
use_workflow_test_branch() |
use_workflow_test_branch() |
Add a workflow that syncs main to the test branch |
use_workflow_rust_compatible_check() |
use_workflow_rust_compatible_check() |
Add a Rust-compatible R-CMD-check workflow |
open_cffinit() |
open_cffinit() |
Open the cffinit CITATION.cff generator in the browser |
| Function | Quick usage | Purpose |
|---|---|---|
badge_to_readme() |
badge_to_readme(badge) |
Insert a badge into the README badges block |
badge_translated_by_ai() |
badge_translated_by_ai(lang = "zh-cn") |
Generate an AI-translation disclaimer badge |
use_multilanguage_readme() |
use_multilanguage_readme("zh-cn") |
Create translated README files and their badges |
render_rmd() |
render_rmd("README.Rmd") |
Render an .Rmd or .R file to Markdown |
use_hexsticker() |
use_hexsticker("man/figures/logo.png") |
Deprecated; add a hex sticker to the README title |
| Function | Quick usage | Purpose |
|---|---|---|
create_standalone() |
create_standalone("my_utils") |
Create a standalone file with a YAML header |
check_standalone() |
check_standalone("R/standalone-my_utils.R") |
Check the format of a standalone file |
update_time_in_standalone() |
update_time_in_standalone() |
Refresh the last-updated field of standalone files |
add_changelog_in_standalone() |
add_changelog_in_standalone("R/standalone-my_utils.R", "Fix a bug") |
Add or update a changelog entry |
inquire_standalone() |
inquire_standalone("r-lib", "rlang") |
List the standalone files of a GitHub repository |
browse_standalone() |
browse_standalone() |
Search GitHub for standalone files shipped by R packages |
| Function | Quick usage | Purpose |
|---|---|---|
current_packages() |
current_packages() |
Packages whose calls should be qualified |
imported_functions() |
imported_functions() |
Function names imported in NAMESPACE |
is_dev_context() |
is_dev_context() |
Whether the working directory is package development |
get_positron_version() |
get_positron_version() |
Version of the running Positron IDE |
After v0.1.23, rpkgkit ships an addin that can be used in RStudio.
It’s available in the Addins menu, and can be accessed by pressing
Ctrl+Shift+P (Windows/Linux) or Cmd+Shift+P (macOS).
If you want to use addins in Positron, you can use Positron R Wizard extension.
rpkgkit ships an agent skill that tells coding agents when to reach
for rpkgkit and how to call it. It follows the Agent
Skills layout, so it works with Claude Code, Codex,
Cursor, Positron, and other compatible agents:
npx skills add WangLabCSU/rpkgkit --skill rpkgkitAdd -g to install it for every project, and -a <agent> to skip the
agent prompt. The skill source lives in
skills/rpkgkit/.
We would like to thank the following people and projects:
- The authors of the pedant package —
Jacob Scott, Christopher T. Kenny, and Sebastian Lammers —
whose code is included (under MIT license) in
R/vendor-pedant.R. - The authors of the pkgdev
package — Diego Hernangómez — whose code is included (under MIT
license) in
R/vendor-pkgdev.R. - All contributors and users who have reported issues, suggested features, or helped improve the package.
