Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
In the previous post we looked at how to apply a linter and styler to a Python Project. Now we’re going to do the same for an R project. We’ll use the {precommit}
R package to make the setup a breeze.
Install
Install the {precommit}
package.
install.packages("precommit")
Setup
Setup precommit
for a project.
precommit::use_precommit()
That will create the .pre-commit-config.yaml
configuration file and, if present, also add it to .Rbuildignore
.
The content of the .pre-commit-config.yaml
file should look something like this (I’ve stripped out comment for brevity):
repos: - repo: https://github.com/lorenzwalthert/precommit rev: v0.3.2.9001 hooks: - id: style-files args: [--style_pkg=styler, --style_fun=tidyverse_style] - id: roxygenize - id: use-tidy-description - id: spell-check exclude: > (?x)^( .*\.[rR]| .*\.feather| .*\.jpeg| .*\.pdf| .*\.png| .*\.py| .*\.RData| .*\.rds| .*\.Rds| .*\.Rproj| .*\.sh| (.*/|)\.gitignore| (.*/|)\.gitlab-ci\.yml| (.*/|)\.lintr| (.*/|)\.pre-commit-.*| (.*/|)\.Rbuildignore| (.*/|)\.Renviron| (.*/|)\.Rprofile| (.*/|)\.travis\.yml| (.*/|)appveyor\.yml| (.*/|)NAMESPACE| (.*/|)renv/settings\.dcf| (.*/|)renv\.lock| (.*/|)WORDLIST| \.github/workflows/.*| data/.*| )$ - id: lintr - id: readme-rmd-rendered - id: parsable-R - id: no-browser-statement - id: no-debug-statement - id: deps-in-desc - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.3.0 hooks: - id: check-added-large-files args: ['--maxkb=200'] - id: file-contents-sorter files: '^\.Rbuildignore$' - id: end-of-file-fixer exclude: '\.Rd' - repo: https://github.com/pre-commit-ci/pre-commit-ci-config rev: v1.5.1 hooks: - id: check-pre-commit-ci-config - repo: local hooks: - id: forbid-to-commit name: Don't commit common R artifacts entry: Cannot commit .Rhistory, .RData, .Rds or .rds. language: fail files: '\.(Rhistory|RData|Rds|rds)$' # `exclude: <regex>` to allow committing specific files ci: autoupdate_schedule: monthly
If you’re using {roxygen2}
then you might be prompted to run the following:
precommit::snippet_generate('additional-deps-roxygenize')
That will probably generate additional instructions about changes you need to make to the id: roxygenize
key in the .pre-commit-config.yaml
file. Apply those.
Extra Hooks
You might also want to add the trailing-whitespace
and check-yaml
rules to .pre-commit-config.yaml
under the https://github.com/pre-commit/pre-commit-hooks repository.
Commit
Once you’ve configured {precommit}
, stage the .pre-commit-config.yaml
and .Rbuildignore
files and then try to commit. You might need to work fairly hard to get all of the checks passing, especially if there’s quite a lot of code in the repository. Just be systematic in addressing each of the errors raised by the hook processes.
You might get an error about /usr/lib/R/Rscript
not being found. This means that pre-commit is looking in the wrong place for Rscript
. I simply made a link from /usr/lib/R/Rscript
to the actual location of Rscript
.
The {lintr} Package
The {lintr}
package will perform static analysis on your R code and help identify syntatic problems.
Install
Install {lintr}
.
install.packages("lintr")
Configure
Create a .lintr
file in the project root.
lintr::use_lintr()
You can update the .lintr
file to tweak the way that {lintr}
will treat your files.
linters: linters_with_defaults( line_length_linter(120), object_usage_linter = NULL, object_name_linter(c("snake_case", "SNAKE_CASE")), commented_code_linter = NULL ) exclusions: list() encoding: "UTF-8"
You might want to add in "dotted.case"
as another argument to object_name_linter()
.
Excluding Code
You can exclude chunks of code from linting by adding nolint
hints as comments.
# The following line of code will be ignored by {lintr}. n <- 42 # nolint # The following block of code will be ignored by {lintr}. # nolint start n <- 41 n <- n + 1 # nolint end
The {styler} Package
By default the {precommit}
package will invoke the {styler}
package and apply the Tidyverse style (via tidyverse_style
).
Install
Install {styler}
.
install.packages("styler")
Flourish
With the {lintr}
and {styler}
packages installed and kicked off on every commit via the pre-commit framework you can be confident that the code you push is both syntactically correct and consistently formatted.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.