>
devtools::check() doesn't catch.usethis::use_news_md() if not already presentusethis::use_cran_comments() if not already presentinstall.packages("pkgname")).devtools::build_readme() to re-render README.mdTitle: and Description: fields (see detailed guidance below)@return and @examples (see detailed guidance below)Authors@R: includes a copyright holder with role [cph]urlchecker::url_check() and fix any issues@return documentation for all exported functions. Use the roxygen2 tag @return to document what the function returns.@keywords internal@return None or similar# Missing @return - WILL BE REJECTED
#' Calculate sum
#' @export
my_sum <- function(x, y) {
x + y
}
# Correct - includes @return
#' Calculate sum
#' @param x First number
#' @param y Second number
#' @return A numeric value
#' @export
my_sum <- function(x, y) {
x + y
}
# For functions with no return value
#' Print message
#' @param msg Message to print
#' @return None, called for side effects
#' @export
print_msg <- function(msg) {
cat(msg, "\n")
}
@examples section. Use the roxygen2 tag @examples.@keywords internal::: notation: pkg:::my_fun()@noRd tag to suppress .Rd file creation\dontrun{} Sparingly\dontrun{} should only be used if the example really cannot be executed (e.g., missing additional software, API keys, etc.).try() insteadgooglesheets4::sheets_has_token()) with if () blocksinteractive() can be used as the condition\donttest{}# BAD - Will be rejected
#' @examples
#' # my_function(x) # Don't do this!
@examplesIf for entire example sections requiring suggested packages:#' @examplesIf rlang::is_installed("dplyr")
#' library(dplyr)
#' my_data %>% my_function()
#' @examples
#' if (rlang::is_installed("dplyr")) {
#' library(dplyr)
#' my_data %>% my_function()
#' }
tools::toTitleCase() to help format.# BAD
Title: A Toolkit for the Construction of Modeling Packages for R
# GOOD
Title: Construct Modeling Packages
# BAD
Title: Command Argument Parsing for R
# GOOD
Title: Command Argument Parsing
# GOOD
Title: Interface to 'Tiingo' Stock Price API
# BAD
Description: This package provides functions for rendering slides.
Description: Functions for rendering slides to different formats.
# GOOD
Description: Render slides to different formats including HTML and PDF.
# BAD (too short)
Description: Render slides to different formats.
# GOOD
Description: Render slides to different formats including HTML and PDF.
Supports custom themes and progressive disclosure patterns. Integrates
with 'reveal.js' for interactive presentations. Designed for technical
presentations and teaching materials.
# BAD
Description: Uses 'case_when()' to process data.
# GOOD
Description: Uses case_when() to process data with 'dplyr'.
# BAD
Description: Implements X-SAMPA processing.
# GOOD
Description: Implements Extended Speech Assessment Methods Phonetic
Alphabet (X-SAMPA) processing.
# BAD
Description: Handles dates like "the first Monday of December".
# GOOD
Description: Handles dates like the first Monday of December.
https:// protocol for all URLs. HTTP links will be rejected.# BAD
URL: http://paleobiodb.org/
# GOOD
URL: https://paleobiodb.org/
Found the following (possibly) invalid URLs:
URL: https://h3geo.org/docs/core-library/coordsystems#faceijk-coordinates
(moved to https://h3geo.org/docs/core-library/coordsystems/)
# Find redirecting URLs
urlchecker::url_check()
# Automatically update to final destinations
urlchecker::url_update()
urlchecker::url_check() flags these URLs, leave them as-is. They are aspirational URLs that will work once the package is on CRAN.Found the following (possibly) invalid file URI:
URI: CODE_OF_CONDUCT.md
From: README.md
.Rbuildignore. Solutions:.Rbuildignoreusethis::use_code_of_conduct() which generates sections without relative links[cph] role to Authors field, even if you're the only author:# Required
Authors@R: person("John", "Doe", role = c("aut", "cre", "cph"))
Authors@R: c(
person("Jane", "Doe", role = c("aut", "cre"),
email = "jane.doe@posit.co"),
person("Posit Software, PBC", role = c("cph", "fnd"),
comment = c(ROR = "03wc8by49"))
)
# If LICENSE shows 2024 but submitting in 2026
# Update: 2024 → 2026
If there are references describing the methods in your package, please add these in the description field...
cran-comments.md:## Method References
There are no published references describing the methods in this package.
The package implements original functionality for [brief description].
@return, @examples, @examplesIf, @noRd)devtools::build_readme()# Before
Title: A Toolkit for the Construction of Modeling Packages for R
# After
Title: Construct Modeling Packages
# Before
Description: This package provides functions for rendering slides.
# After
Description: Render slides to different formats including HTML and PDF.
Supports custom themes and progressive disclosure. Integrates with
'reveal.js' for interactive presentations.
# Before - Missing @return
#' Calculate total
#' @param x Values
#' @export
calc_total <- function(x) sum(x)
# After - Complete documentation
#' Calculate total
#' @param x Numeric values to sum
#' @return A numeric value representing the sum
#' @examples
#' calc_total(1:10)
#' @export
calc_total <- function(x) sum(x)
tools::toTitleCase() - Format titles with proper capitalizationurlchecker::url_check() - Find problematic URLsurlchecker::url_update() - Fix redirecting URLsusethis::use_news_md() - Create NEWS.mdusethis::use_cran_comments() - Create cran-comments.mddevtools::build_readme() - Re-render README.md from README.Rmdusethis::use_code_of_conduct() - Add CoC without relative linksusethis::use_build_ignore() - Ignore files in R package buildusethis::use_package() - Add a package dependency to DESCRIPTIONusethis::use_tidy_description() - Tidy up DESCRIPTION formattingNEWS.md exists and documents changes for this versioncran-comments.md exists with submission notesdevtools::build_readme() was runinstall.packages("pkgname"))Title: uses title caseTitle: has no redundant phrases ("A Toolkit for", "Tools for", "for R")Title: quotes all software/package names in single quotesTitle: is under 65 charactersDescription: does NOT start with "This package", package name, or "Functions for"Description: is 3-4 sentences explaining purpose and utilityDescription: quotes software/package/API names (including 'R') but NOT function namesDescription: expands all acronyms on first mentionDescription: uses double quotes only for publication titlesAuthors@R: includes copyright holder with [cph] roleperson("Posit Software, PBC", role = c("cph", "fnd"), comment = c(ROR = "03wc8by49"))@return documentation@examples\dontrun{} unless truly necessary@examplesIf or if guards::: notation or @noRdurlchecker::url_check() was run.Rbuildignore filescran-comments.md