在 snakemake 的参数中传递通配符值

Passing wildcard values in params in snakemake

我正在尝试使用 snakemake 清理数据管道。看起来通配符是我需要的,但我无法让它在 params

中工作

我的函数需要一个取决于通配符值的参数。例如,假设 它取决于 sample 可以是 AB.

我尝试了以下方法(我的示例比较复杂,但这基本上就是我想要做的):

sample = ["A","B"]

import pandas as pd

def dummy_example(sample):
    return pd.DataFrame({"values": [0,1], "sample": sample})

rule all:
    input:
        "mybucket/sample_{sample}.csv"

rule testing_wildcards:
    output:
        newfile="mybucket/sample_{sample}.csv"
    params:
        additional="{sample}"
    run:
        df = dummy_example(params.additional)
        df.to_csv(output.newfile, index = False)

这给了我以下错误:

Wildcards in input files cannot be determined from output files: 'sample'

我按照文档将 expand 放在 output 部分。 对于 params,看起来 this section and 给了我所需的一切

sample_list = ["A","B"]

import pandas as pd
import re

def dummy_example(sample):
    return pd.DataFrame({"values": [0,1], "sample": sample})
    
def get_wildcard_from_output(output):
    return re.search(r'sample_(.*?).csv', output).group(1)

rule all:
    input:
        expand("sample_{sample}.csv", sample = sample_list)

rule testing_wildcards:
    output:
        newfile=expand("sample_{sample}.csv", sample = sample_list)
    params:
        additional=lambda wildcards, output: get_wildcard_from_output(output)
    run:
        print(params.additional)
        df = dummy_example(params.additional)
        df.to_csv(output.newfile, index = False)

InputFunctionException in line 16 of /home/jovyan/work/Snakefile: Error: TypeError: expected string or bytes-like object Wildcards:

是否有某种方法可以捕获参数中通配符的值以应用 run 中的值?

我认为您正试图让 sample 通配符用作脚本中的参数。

wc 变量是 snakemake.io.Wildcards which is a snakemake.io.Namedlist 的实例。 您可以在这些对象上调用 .get(key),因此我们可以使用 lambda 函数来生成参数。

samples_from_wc=lambda wc: wc.get("sample") 并在 run/shell 中将其用作 params.samples_from_wc

sample_list = ["A","B"]

import pandas as pd

def dummy_data(sample):
    return pd.DataFrame({"values": [0, 1], "sample": sample})

rule all:
    input: expand("sample_{sample}.csv", sample=sample_list)

rule testing_wildcards:
    output:
        newfile="sample_{sample}.csv"
    params:
        samples_from_wc=lambda wc: wc.get("sample")
    run:
        # Load input
        df = dummy_data(params.samples_from_wc)
        # Write output
        df.to_csv(output.newfile, index=False)