checkhelper
A package to help you deal with devtools::check()
outputs and helps
avoids problems with CRAN submissions
Complete documentation in the {pkgdown} site: https://thinkr-open.github.io/checkhelper/
Installation
You can install the last version of checkhelper from github with:
remotes::install_github("thinkr-open/checkhelper")
Examples
- Check your current package under development and get all the globals
missing:
no visible global variable
andno visible global function
- Detect exported functions with missing or empty
@return
/@noRd
tags
Directly in your package in development
- Use
checkhelper::find_missing_tags()
on your package in development to find which functions are exported but missing@export
roxygen2 tag.- CRAN policy asks for every exported function to have a value
(named
@export
when using {roxygen2}). - This also checks that not exported functions dont have roxygen
title, or have
@noRd
in case you facedPlease add \value to .Rd files
CRAN message for documented but not exported functions.
- CRAN policy asks for every exported function to have a value
(named
- You can directly use
checkhelper::print_globals()
on your package instead ofdevtools::check()
. This is a wrapper aroundrcmdcheck::rcmdcheck()
. This will run the checks and directly list the potential “globalVariables” to add in aglobals.R
file.
checkhelper::find_missing_tags()
checkhelper::print_globals(quiet = TRUE)
Reproducible example with a fake package in tempdir
- Create a fake package with
- a function having global variables
- a function with
@export
but no@return
- a function with title but without
@export
and thus missing@noRd
library(checkhelper)
# Create fake package ----
pkg_path <- tempfile(pattern = "pkg.")
dir.create(pkg_path)
# Create fake package
usethis::create_package(pkg_path, open = FALSE)
#> ✔ Setting active project to '/tmp/Rtmp23xgFb/pkg.416665a6ac09'
#> ✔ Creating 'R/'
#> ✔ Writing 'DESCRIPTION'
#> ✔ Writing 'NAMESPACE'
#> ✔ Setting active project to '<no active project>'
# Create function no visible global variables and missing documented functions
cat("
#' Function
#' @importFrom dplyr filter
#' @export
my_fun <- function() {
data %>%
filter(col == 3) %>%
mutate(new_col = 1) %>%
ggplot() +
aes(x, y, colour = new_col) +
geom_point()
}
#' Function not exported but with doc
my_not_exported_doc <- function() {
message('Not exported but with title, should have @noRd')
}
", file = file.path(pkg_path, "R", "function.R"))
attachment::att_amend_desc(path = pkg_path)
#> Updating pkg.416665a6ac09 documentation
#> ℹ Loading pkg.416665a6ac09Writing 'NAMESPACE'Writing 'NAMESPACE'Writing 'my_fun.Rd'Writing 'my_not_exported_doc.Rd'[+] 1 package(s) added: dplyr.
# Files of the package
fs::dir_tree(pkg_path, recurse = TRUE)
- Find missing
@return
and find missing@noRd
for not exported function with documentation
find_missing_tags(pkg_path)
#> ℹ Loading pkg.416665a6ac09
#> Missing or empty return value for exported functions: my_fun
#>
#>
#>
#> Doc available but need to choose between `@export` or `@noRd`: my_not_exported_doc
#>
#>
#>
#> ℹ Loading pkg.416665a6ac09
#> # A tibble: 2 × 11
#> id filename topic has_export has_return return_value has_nord rdname_value
#> <int> <chr> <chr> <lgl> <lgl> <chr> <lgl> <chr>
#> 1 1 function… my_f… TRUE FALSE "" FALSE my_fun
#> 2 2 function… my_n… FALSE FALSE "" FALSE my_not_expo…
#> # … with 3 more variables: not_empty_return_value <lgl>,
#> # test_has_export_and_return <chr>, test_has_export_or_has_nord <chr>
- Get global variables
globals <- get_no_visible(pkg_path, quiet = TRUE)
globals
#> $globalVariables
#> # A tibble: 4 × 6
#> notes fun is_function is_global_varia… variable proposed
#> <chr> <chr> <lgl> <lgl> <chr> <chr>
#> 1 my_fun: no visible bindi… my_f… FALSE TRUE data " impor…
#> 2 my_fun: no visible bindi… my_f… FALSE TRUE x <NA>
#> 3 my_fun: no visible bindi… my_f… FALSE TRUE y <NA>
#> 4 my_fun: no visible bindi… my_f… FALSE TRUE new_col <NA>
#>
#> $functions
#> # A tibble: 5 × 6
#> notes fun is_function is_global_varia… variable proposed
#> <chr> <chr> <lgl> <lgl> <chr> <chr>
#> 1 my_fun: no visible globa… my_f… TRUE FALSE %>% <NA>
#> 2 my_fun: no visible globa… my_f… TRUE FALSE mutate <NA>
#> 3 my_fun: no visible globa… my_f… TRUE FALSE ggplot <NA>
#> 4 my_fun: no visible globa… my_f… TRUE FALSE aes <NA>
#> 5 my_fun: no visible globa… my_f… TRUE FALSE geom_po… <NA>
- Print globals to copy-paste
print_globals(globals)
#> --- Functions to add in NAMESPACE (with @importFrom ?) ---
#>
#> my_fun: %>%, aes, geom_point, ggplot, mutate
#>
#> --- Potential GlobalVariables ---
#> -- code to copy to your globals.R file --
#>
#> globalVariables(unique(c(
#> # my_fun:
#> "data", "new_col", "x", "y"
#> )))
-
Store the output of
print_globals()
in package usingusethis::use_r("globals")
. Note that you can also transform all these variables with.data[[variable]]
Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.