使用snakemake中的expand()函数多次执行shell命令

问题描述 投票:0回答:2

我想在snakemake的帮助下对不同的输入文件多次执行R脚本。为此,我尝试使用expand函数。

[我对snakemake还是比较陌生,当我正确理解它时,扩展功能为我提供了多个输入文件,然后这些文件全部连接起来并可以通过{input}使用。

是否可以一一调用文件上的shell命令?

假设我在config.yaml中具有此定义:

types:
    - "A"
    - "B" 

这将是我的示例规则:

rule manual_groups:
    input:
        expand("chip_{type}.bed",type=config["types"])
    output:
        expand("data/p_chip_{type}.model",type=config["types"])
    shell:
        "Rscript scripts/pre_process.R {input}"

这将导致命令:

Rscript scripts/pre_process.R chip_A.bed chip_B.bed

是否有可能像这样的两种类型分别两次调用该命令:

Rscript scripts/pre_process.R chip_A.bed
Rscript scripts/pre_process.R chip_B.bed

谢谢您的任何帮助!

snakemake
2个回答
0
投票

final target files中定义rule all,然后在规则type中使用适当的通配符(即manual_groups)。对于rule manual_groups中列出的每个输出文件,这将分别运行rule all

rule all:
    input:
        expand("data/p_chip_{type}.model",type=config["types"])


rule manual_groups:
    input:
        "chip_{type}.bed"
    output:
        "data/p_chip_{type}.model"
    shell:
        "Rscript scripts/pre_process.R {input}"

PS-由于与Python的type方法可能存在冲突,因此您可能想更改通配符type


0
投票

我同意@ManavalanGajapathy的回答,这是解决[[your问题的最可靠解决方案。但是,这不是一个完整的答案。

expand只是Snakemake中定义的常规Python函数。这意味着您可以在使用Python的任何地方使用它。它只是一个实用程序,它接受字符串和参数进行替换,并返回字符串列表,其中每个字符串都是单个替换的结果。该实用程序可以在许多地方使用。在下面,我提供了一个说明这个想法的漂亮示例。假设您需要将一个文本文件作为输入并替换一些字符(该列表应从config中提供)。假设您知道唯一的方法:作为sed脚本的管道。像这样:

cat input.txt | sed 's/A/a/g' | sed 's/B/b/g' | sed 's/C/c/g' > output.txt

得出的结论是,您需要管道处理一系列sed命令,该命令有两个符号不同:sed's / 

X / x / g'。这是使用expand函数的解决方案:

rule substitute: input: "input.txt" output: "output.txt" params: from = ["A", "B", "C"], to = ["a", "b", "c"] shell: "cat {input} | " + " | ".join(expand("sed 's/{from}/{to}/g'", zip, from=params.from, to=params.to)) + " > {output}"
© www.soinside.com 2019 - 2024. All rights reserved.