Concepts like reproducibility, integrity and collaborative development are a “must” for using R in production.
Among other common best practices (modularize your code, structure it as a package, define unit testing and automate with CI / CD pipelines), managing code dependencies is a fundamental step for ensuring quality and robustness of your project. In fact, by not specifying the versions of your package dependencies, your project is exposed to uncontrolled dependency updates, causing potential breaks or — even worst — introducing non-breaking unexpected behaviors.
While on the one hand you may want to benefit from the latest developments in the community, on the other hand you must ensure integrity and reproducibility of your product. Therefore, controlling — and potentially aligning — development and productive environments is essential.
However, for an
R project this may not be trivial. For this reason we at Mirai Solutions have added a new chapter to our techguides, describing how to manage dependencies using
renv is a package that helps you creating
renv-project, the dependencies are automatically detected and, if out of sync, the user can chose to
renv::restore() them. This approach ensures that dependencies can be collaboratively shared and maintained at project level.
To initialize a package with
renv::init( # use the DESCRIPTION file to capture dependencies settings = list(snapshot.type = "explicit"), # do not install dependencies (done in a custom way) bare = TRUE )
Dependencies can then be installed from a specific MRAN snapshot, i.e. with a fixed version.
# Install all dependencies from a specific MRAN date repo options(repos = "https://mran.microsoft.com/snapshot/2020-11-15") renv::install("remotes") (deps <- remotes::dev_package_deps(dependencies = TRUE)) renv::install(with(deps, sprintf("%s@%s", package[diff!=0], available[diff!=0])))
Finally, to enable tracking of the dependencies:
This will create a snapshot of the dependencies in the form of a lockfile
renv.lock , which should be shared under version control to ensure that anyone accessing the project would have the same R environment.
As a note,
renv tracks and installs only the packages explicitly mentioned in the
DESCRIPTION file. This means that packages needed for development, e.g.
devtools, should be be installed for the specific project separately.
As a reference on how to use
renv, have a look at the dedicated chapter in the techguides.
To know more about using
renv for safely bringing a
shiny app to production, don’t miss the chance to attend our workshop “Bring a Shiny App to Production”, taking place online on March 31st, 14-17 CET. In this hands-on workshop, additionally to
renv, we will discuss other best practices such as: version control, automated CI/CD pipelines with GitHub Actions, and how to use GitFlow in a collaborative setup.