As always during software development, we were faced with tough design choices while developing this package. We want to clearly document which choices were made, and what are the reasons behind them.
Package and version management
Breaking changes during R package updates in one of the major sources of non-reproducibility and of headaches for R users of all levels. To guard users against this, but also to ensure that the provided templates work out of the box, throughout the time a given episoap version is on CRAN, we pin specific versions for our dependencies, via renv.
We recognize this approach is not practical for all situations, and in particular, differs from the dependency management framework in R or python packages. However, we do believe it is the best trade-off between usability, maintainability and flexibility in the context of pipeline templates:
- it ensures pipelines work in the long-term, independently of release timings and machine-specific characteristics (in particular pre-existing package library)
- it doesn’t blur the lines between the package installation and the package loading steps
- it doesn’t interfere with the user existing package library. In other words, it doesn’t permanently modify the system settings.
You can read the dedicated issue for more context behind this choice and the possible downsides.
Pinned version updates
To avoid forcing the users to deal with obsolete package versions, we
update the template code to work with the latest CRAN version of each
package, just before updating episoap itself on CRAN by
running renv::embed()
in each of the Rmarkdown files.