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/
Install from CRAN
install.packages("checkhelper")
You can install the last version of checkhelper from r-universe with:
install.packages('checkhelper', repos = 'https://thinkr-open.r-universe.dev')
Or from GitHub:
remotes::install_github("thinkr-open/checkhelper")
no visible global variable
and no visible global function
@return
/ @noRd
tagscheckhelper::find_missing_tags()
on your package in development
to find which functions are exported but missing @export
roxygen2
tag.@export
when using {roxygen2}).@noRd
in case you faced
Please add \value to .Rd files
CRAN message for documented but not
exported functions.checkhelper::print_globals()
on your package
instead of devtools::check()
. This is a wrapper around
rcmdcheck::rcmdcheck()
. This will run the checks and directly list
the potential “globalVariables” to add in a globals.R
file.checkhelper::find_missing_tags()
checkhelper::print_globals(quiet = TRUE)
@export
but no @return
@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/RtmprzMcDg/pkg.2b822dec9ea8'
#> ✔ 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)
#> Saving attachment parameters to yaml config file
#> Updating pkg.2b822dec9ea8 documentation
#> ℹ Loading pkg.2b822dec9ea8Writing ']8;;file:///tmp/RtmprzMcDg/pkg.2b822dec9ea8/NAMESPACENAMESPACE]8;;'Writing ']8;;file:///tmp/RtmprzMcDg/pkg.2b822dec9ea8/NAMESPACENAMESPACE]8;;'Writing ']8;;ide:run:pkgload::dev_help('my_fun')my_fun.Rd]8;;'Writing ']8;;ide:run:pkgload::dev_help('my_not_exported_doc')my_not_exported_doc.Rd]8;;'ℹ Loading pkg.2b822dec9ea8[+] 1 package(s) added: dplyr.
# Files of the package
fs::dir_tree(pkg_path, recurse = TRUE)
@return
and find missing @noRd
for not exported
function with documentationfind_missing_tags(pkg_path)
#> ℹ Loading pkg.2b822dec9ea8
#> Problem: Missing or empty return value for exported functions: my_fun
#>
#>
#>
#> Problem: Doc available but need to choose between `@export` or `@noRd`: my_not_exported_doc
#>
#>
#>
#> ℹ Loading pkg.2b822dec9ea8
#> $package_doc
#> # A tibble: 0 × 0
#>
#> $data
#> # A tibble: 0 × 0
#>
#> $functions
#> # A tibble: 2 × 11
#> id filename topic has_e…¹ has_r…² retur…³ has_n…⁴ rdnam…⁵ not_e…⁶ test_…⁷
#> <int> <chr> <chr> <lgl> <lgl> <chr> <lgl> <chr> <lgl> <chr>
#> 1 1 function.R my_f… TRUE FALSE "" FALSE my_fun FALSE not_ok
#> 2 2 function.R my_n… FALSE FALSE "" FALSE my_not… FALSE ok
#> # … with 1 more variable: test_has_export_or_has_nord <chr>, and abbreviated
#> # variable names ¹has_export, ²has_return, ³return_value, ⁴has_nord,
#> # ⁵rdname_value, ⁶not_empty_return_value, ⁷test_has_export_and_return
globals <- get_no_visible(pkg_path, quiet = TRUE)
globals
#> $globalVariables
#> # A tibble: 4 × 7
#> notes filep…¹ fun is_fu…² is_gl…³ varia…⁴ propo…⁵
#> <chr> <chr> <chr> <lgl> <lgl> <chr> <chr>
#> 1 my_fun: no visible binding for … - my_f… FALSE TRUE data " impo…
#> 2 my_fun: no visible binding for … - my_f… FALSE TRUE x <NA>
#> 3 my_fun: no visible binding for … - my_f… FALSE TRUE y <NA>
#> 4 my_fun: no visible binding for … - my_f… FALSE TRUE new_col <NA>
#> # … with abbreviated variable names ¹filepath, ²is_function,
#> # ³is_global_variable, ⁴variable, ⁵proposed
#>
#> $functions
#> # A tibble: 5 × 7
#> notes filep…¹ fun is_fu…² is_gl…³ varia…⁴ propo…⁵
#> <chr> <chr> <chr> <lgl> <lgl> <chr> <chr>
#> 1 my_fun: no visible global funct… - my_f… TRUE FALSE %>% <NA>
#> 2 my_fun: no visible global funct… - my_f… TRUE FALSE mutate <NA>
#> 3 my_fun: no visible global funct… - my_f… TRUE FALSE ggplot <NA>
#> 4 my_fun: no visible global funct… - my_f… TRUE FALSE aes <NA>
#> 5 my_fun: no visible global funct… - my_f… TRUE FALSE geom_p… <NA>
#> # … with abbreviated variable names ¹filepath, ²is_function,
#> # ³is_global_variable, ⁴variable, ⁵proposed
print_globals(globals)
#> --- Functions to add in NAMESPACE (with @importFrom ?) ---
#>
#> my_fun: %>%, aes, geom_point, ggplot, mutate
#>
#> --- Potential GlobalVariables ---
#> -- code to copy to your R/globals.R file --
#>
#> globalVariables(unique(c(
#> # my_fun:
#> "data", "new_col", "x", "y"
#> )))
print_globals()
in package using
usethis::use_r("globals")
. Note that you can also transform all
these variables with .data[[variable]]
Have you faced a note on CRAN about non-standard things in the check directory ?
Check: for non-standard things in the check directory
Result: NOTE
Found the following files/directories:
‘extrapackage’
Maybe you do not understand where these files came from.
Then, you can run check_clean_userspace()
in your package directory to
detect every files that you created during the check.
They could be issued from examples, tests or vignettes:
check_clean_userspace()
will tell you.
check_clean_userspace()
#> Package: checkpackage
#> Title: What the Package Does (One Line, Title Case)
#> Version: 0.0.0.9000
#> Authors@R (parsed):
#> * First Last <first.last@example.com> [aut, cre] (YOUR-ORCID-ID)
#> Description: What the package does (one paragraph).
#> License: `use_mit_license()`, `use_gpl3_license()` or friends to pick a
#> license
#> Encoding: UTF-8
#> Roxygen: list(markdown = TRUE)
#> RoxygenNote: 7.2.2
#> ✔ | F W S OK | Context
#> ⠏ | 0 | in_test
#> ══ Results ═════════════════════════════════════════════════════════════════════
#> [ FAIL 0 | WARN 0 | SKIP 0 | PASS 0 ]
#>
#> 🌈 Your tests are over the rainbow 🌈
#> ── Running 4 example files ───────────────────────────────────── checkpackage ──
#>
#> > text <- "in_example"
#>
#> > file <- tempfile("in_example")
#>
#> > cat(text, file = file)
#> Warning in check_clean_userspace(pkg = path, check_output = check_output): One
#> of the 'Run examples' .R file was created to run examples. You should not bother
#> about it
#> # A tibble: 5 × 4
#> source problem where file
#> <chr> <chr> <chr> <chr>
#> 1 Unit tests added /tmp/RtmprzMcDg/pkg-2b82ce31126/checkpackage /tmp/Rtmprz…
#> 2 Unit tests added /tmp/RtmprzMcDg /tmp/Rtmprz…
#> 3 Run examples added /tmp/RtmprzMcDg /tmp/Rtmprz…
#> 4 Run examples added /tmp/RtmprzMcDg /tmp/Rtmprz…
#> 5 Full check added /tmp/RtmprzMcDg /tmp/Rtmprz…
Use the exploration of CRAN scripts by the RConsortium to check a package as CRAN does it with their env. variables. See https://github.com/RConsortium/r-repositories-wg/issues/17 for more details.
# Check the current directory
check_as_cran()
Please note that the checkhelper project is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.