Create PDF reports using R Markdown (TinyTeX) in Snakemake using Conda

326 views Asked by At

I am currently having problems using TinyTeX in a conda environment with Snakemake. I have to install TinyTeX installation files using the command tinytex::install_tinytex() before running the pipeline. This installs TinyTeX outside of the created environment (which isn't that big of a problem... but not preferred either) . The main problem is that every time I execute my Snakemake pipeline it will try to reinstall this installation which I don't want. Could anyone tell me what the easiest way is for me to check whether it's installed already? Should I be using the command Rscript -e \"tinytex:::is_tinytex()\" with an if-statement? And what is the best way to write that if-statement by calling Rscript -e in Snakemake? Or should I just write a boolean text-file on first run which specifies whether TinyTeX has been installed before?

It kinda sucks that the TinyTeX conda dependency doesn't work on its own without additional installation...

Snakemake rule (ignore input/output):

rule assembly_report_rmarkdown:
    input:
        rules.assembly_graph2image_bandage.output,
        rules.assembly_assessment_quast.output,
        rules.coverage_calculator_shortreads.output,
        rules.coverage_calculator_longreads.output
    output:
        config["outdir"] + "Hybrid_assembly_report.pdf"
    conda:
        "envs/r-rmarkdown.yaml"
    shell:
        """
        cp report/RMarkdown/Hybrid_assembly_report.Rmd {config[outdir]}Hybrid_assembly_report.Rmd
        Rscript -e \"tinytex::install_tinytex()\"
        Rscript -e \"rmarkdown::render('{config[outdir]}Hybrid_assembly_report.Rmd')\"
        rm -f {config[outdir]}Hybrid_assembly_report.Rmd {config[outdir]}Hybrid_assembly_report.tex
        """

Conda YAML:

name: r-rmarkdown
channels:
  - conda-forge
  - bioconda
dependencies:
  - r-base=4.0.3
  - r-rmarkdown=2.5
  - r-tinytex=0.27

Thanks in advance.

1

There are 1 answers

0
SergeW On

I think I've solved the issue. Instead of calling Rscript -e, I have put the following if-statement in the setup chunk in R Markdown (Which runs before running any other code if i'm correct). I then proceeded to uninstall TinyTeX to see whether it will install for once only which it did.

knitr::opts_chunk$set(echo = TRUE)
library(knitr)
if (!tinytex:::is_tinytex()){
   tinytex::install_tinytex()
}