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)Reproducible example with a fake package in tempdir
@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/NAMESPACE�NAMESPACE�]8;;�'Writing '�]8;;file:///tmp/RtmprzMcDg/pkg.2b822dec9ea8/NAMESPACE�NAMESPACE�]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.
#> 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…
Experimental: Check as CRAN with CRAN global variables
Use the exploration of CRAN scripts by the RConsortium to check a package as CRAN does it with their env. variables. See RConsortium/r-repositories-wg#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.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4