.. include:: substitutions.rst
.. _renv-page:
***************************************************
R with reproducible environments using renv package
***************************************************
The `renv `_ package helps you to create reproducible environments for your `R projects `_. The ``renv.lock`` lockfile records the state of your project’s private library, and can be used to restore the state of that library as required. ``geniac`` can use a ``renv.lock`` lockfile to install all the package dependencies needed by your R environment. However, this is a use case which requires some manual configuration as explained below. ``geniac`` allows you to add as many tools as you wish using ``renv``. In this section, we provide an example using a tool with the label ``renvGlad``.
.. important::
For any tool using ``renv``, its label must have the prefix ``renv``!
Create a conda recipe
======================
Create the conda recipes in the folder ``recipes/conda`` which defines which R version you want to use, for example create ``recipes/conda/renvGlad.yml`` as follows:
::
name: renvGlad
channels:
- conda-forge
- bioconda
- defaults
dependencies:
- r-base=4.3.1=h29c4799.5
Add the label in geniac.config
==================================
In the section ``params.geniac.tools`` of the file ``conf/geniac.config``, add the label with the three scopes ``yml``, ``env`` and ``bioc``, for example:
::
renvGlad {
yml = "${projectDir}/recipes/conda/renvGlad.yml"
env = "${params.condaCacheDir}/custom_renvGlad"
bioc = "3.17"
}
* ``renvGlad.yml`` provides the path to the conda recipe. It should be located in ``"${projectDir}/recipes/conda"``.
* ``renvGlad.env`` defines the name of the environment in the conda cache dir.
* ``renvGlad.bioc`` sets the Bioconductor version which is possibly required to install the R packages.
Create a process to init the renv
=================================
This process allows the usage of the R software with the ``multiconda`` and ``conda`` profiles. During this process, the dependencies provided in the ``renv.lock`` will be installed. The process ``renvInit`` is provided with the documentation: copy the code :download:`renvInit <../data/nf-modules/local/process/renvInit.nf>` into the file ``nf-modules/local/process/renvInit.nf``:
.. literalinclude:: ../data/nf-modules/local/process/renvInit.nf
In your ``main.nf``, include the file ``./nf-modules/local/process/renvInit.nf`` as a nextflow module. The module should be included using a prefix wich is the same as the name of the label of the process that will use `renv `_. In this example, we will consider that the process ``glad`` has the label ``renvGlad``. Therefore, ``renvInit`` module is included as ``renvGladInit`` (i.e. concatenate the label name with ``Init`` suffix):
::
include { renvInit as renvGladInit } from './nf-modules/local/process/renvInit'
Then, in your ``main.nf``:
* invoke the nextflow module ``renvGladInit`` using the label of the tool ``'renvGlad'`` as an argument
* call the process ``glad`` taking as an argument the output of the process ``renvInitGlad``
::
renvGladInit('renvGlad')
glad(renvGladInit.out.renvInitDone)
If you have several processes using `renv `_, do the extact same procedure just using the other label name of your other process.
Copy you ``renv.lock`` file is a sublder inside ``recipes/dependencies/``
==========================================================================
We assume that the reader is familiar with `renv `_. In the folder ``recipes/dependencies/``, create a subfolder with the name of the label of the tool, for example ``recipes/dependencies/renvGald``. Then, copy your ``renv.lock`` file in this subfolder . Here is an example of a ``renv.lock`` file:
.. literalinclude:: ../data/recipes/dependencies/renvGlad/renv.lock
Add a process which uses the renv
=================================
Write you process using the label with the ``renv`` tool and always define in the ``input`` section of the ``val renvInitDone``
::
process glad {
label 'renvGlad'
label 'minCpu'
label 'lowMem'
publishDir "${params.outDir}/GLAD", mode: 'copy'
input:
val renvInitDone
output:
path "BkpInfo.tsv"
script:
"""
Rscript ${projectDir}/bin/apGlad.R
"""
}