在 snakemake 的参数中传递通配符值
Passing wildcard values in params in snakemake
我正在尝试使用 snakemake
清理数据管道。看起来通配符是我需要的,但我无法让它在 params
中工作
我的函数需要一个取决于通配符值的参数。例如,假设
它取决于 sample
可以是 A
或 B
.
我尝试了以下方法(我的示例比较复杂,但这基本上就是我想要做的):
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)
我正在尝试使用 snakemake
清理数据管道。看起来通配符是我需要的,但我无法让它在 params
我的函数需要一个取决于通配符值的参数。例如,假设
它取决于 sample
可以是 A
或 B
.
我尝试了以下方法(我的示例比较复杂,但这基本上就是我想要做的):
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)