即使缺少某些输入,如何运行规则?

时间:2019-12-17 11:01:32

标签: snakemake

在我的过程的第一步中,我将从数据库中提取一些每小时的数据。由于某些原因,数据有时会丢失几个小时,从而形成文件。只要丢失的文件数量不是太大,我仍然希望运行一些依赖于该数据的规则。运行这些规则时,我将检查丢失了多少数据,然后决定是否要生成错误。

下面的例子。 Snakefile

rule parse_data:
    input:
       "data/1.csv", "data/2.csv", "data/3.csv", "data/4.csv"
    output:
       "result.csv"
    shell:
       "touch {output}"


rule get_data: 
    output:
        "data/{id}.csv"
    shell:
        "Rscript get_data.R {output}"

还有我的get_data.R脚本:

output <- commandArgs(trailingOnly = TRUE)[1]

if (output == "data/1.csv") 
  stop("Some error")
writeLines("foo", output)

即使缺少某些输入,如何强制运行规则parse_data?当输入丢失时,我不想强​​制运行任何其他规则。

一种可能的解决方案是,当查询失败时,在get_data.R中生成一个空文件。但是,实际上,我在运行--restart-times 5时也使用snakemake,因为由于数据库超时,查询也可能失败。创建空文件时,此重试查询机制将不再起作用。

1 个答案:

答案 0 :(得分:2)

您需要data-dependent conditional execution

get_data上使用检查点。然后,您将parse_data的输入替换为一个函数,该函数会汇总所有确实存在的文件。

(请注意,我是Snakemake的新手,我自己正在学习,希望对您有帮助)