在带有 Mambaforge 的 Snakemake 工作流程中使用 R

Using R in a Snakemake workflow with Mambaforge

我正在使用 Snakemake 构建管道。一条规则涉及使用 readr 读取 CSV 文件的 R 脚本。当我 运行 使用 --use-singularity--use-conda

的管道时出现此错误
Error: Unknown TZ UTC
In addition: Warning message:
In OlsonNames() : no Olson database found
Execution halted

Google 建议 readr 由于缺少 tzdata but I can't figure out how to install the tzdata package and make readr see it. I am running the entire pipeline in a Mambaforge 容器而崩溃,以确保再现性。 Snakemake 建议在 Miniconda 容器上使用 Mambaforge,因为它更快,但我认为我的错误涉及 Mambaforge,因为使用 Miniconda 解决了错误。

这是重现错误的工作流程:

#Snakefile
singularity: "docker://condaforge/mambaforge"

rule targets:
    input:
        "out.txt"

rule readr:
    input:
        "input.csv"
    output:
        "out.txt"
    conda:
        "env.yml"
    script:
        "test.R"
#env.yml
name: env
channels:
    - default
    - bioconda
    - conda-forge
dependencies:
    - r-readr
    - tzdata
#test.R
library(readr)
fp <- snakemake@input[[1]]
df <- read_csv(fp)
print(df)
write(df$x, "out.txt")

我 运行 工作流程与 snakemake --use-conda --use-singularity。当 Snakemake 工作流程 运行 来自 Mambaforge 奇点容器时,我如何 运行 R 脚本?

查看导致错误的 R 代码堆栈,我看到它检查了 tzdata 包含的 zoneinfo 文件夹的一堆默认位置,但也检查了 TZDIR环境变量。

我相信一个合适的解决方案是让 Conda tzdata 包将这个变量设置为指向它。这将需要 Conda Forge 包的 PR(请参阅 repo issue)。同时,可以执行以下任一操作作为解决方法。

解决方法 1:从 R 设置 TZDIR

继续使用来自 Conda 的 tzdata 包,可以在 R 脚本的开头设置环境变量。

#!/usr/bin/env Rscript

## the following assumes active Conda environment with `tzdata` installed
Sys.setenv("TZDIR"=paste0(Sys.getenv("CONDA_PREFIX"), "/share/zoneinfo"))

我认为这是一个临时解决方法。

解决方法 2:派生一个新的 Docker

否则,制作一个包含系统级 tzdata 安装的新 Docker 映像。这个 appears to be a common issue,所以按照其他示例(并保持干净),它会像这样:

Docker文件

FROM --platform=linux/amd64 condaforge/mambaforge:latest

## include tzdata
RUN apt-get update > /dev/null \
  && DEBIAN_FRONTEND="noninteractive" apt-get install --no-install-recommends -y tzdata > /dev/null \
  && apt-get clean

将此上传到 Docker Hub 并使用它代替 Mambaforge 图像作为 Snakemake 的图像。这可能是一个更可靠的长期解决方案,但也许不是每个人都想创建一个 Docker Hub 帐户。