我正在使用主Snakefile运行工作流程,其中包含rules文件夹中的规则,并从这些包含的规则中调用rscripts。
以下是几行及其具体文件:
Snakefile:
samples = pd.read_table("samples.csv", header=0, sep=',', index_col=0)
rule extract:
input:
'summary/umi_expression_matrix.tsv'
include: "rules/extract_expression_single.smk"
规则/ extract_expression_single.smk:
rule merge_umi:
input:
expand('summary/{sample}_umi_expression_matrix.tsv', sample=samples.index)
output:
'summary/umi_expression_matrix.tsv'
script:
"../scripts/merge_counts_single.R"
脚本/ merge_counts_single.R:
samples = read.csv('samples.csv', header=TRUE, stringsAsFactors=FALSE)$samples
read_list = c()
for (i in 1:length(samples)){
temp_matrix = read.table(snakemake@input[[i]][1], header=T, stringsAsFactors = F)
cell_barcodes = colnames(temp_matrix)[-1]
colnames(temp_matrix) = c("GENE",paste(samples[i], cell_barcodes, sep = "_"))
read_list=c(read_list, list(temp_matrix))
}
# Little function that allows to merge unequal matrices
merge.all <- function(x, y) {
merge(x, y, all=TRUE, by="GENE")
}
read_counts <- Reduce(merge.all, read_list)
read_counts[is.na(read_counts)] = 0
rownames(read_counts) = read_counts[,1]
read_counts = read_counts[,-1]
write.table(read_counts, file=snakemake@output[[1]], sep='\t')
&#34;清洁&#34;这样做的方法是调用snakemake@wildcard.sample将样本名称归属于脚本。但由于某些原因,snakemake @ wildcards是一个空矢量。 在python:
print(type(snakemake.wildcards))
print(snakemake.wildcards)
print('done')
给出:
<class 'snakemake.io.Wildcards'>
done
这意味着它也是空的。 所以现在我必须依赖回到samples.csv文件并获取样本名称。我还需要使用greps仔细检查匹配的索引,不要让样本和文件混淆。
知道为什么会这样吗?
更新
我已经尝试将sample_name添加为params,看看这是否有效,实际上是这样。
rule merge_umi:
input:
expand('summary/{sample}_umi_expression_matrix.tsv', sample=samples.index)
params:
sample_name = lambda wildcards: samples.index
output:
'summary/umi_expression_matrix.tsv'
script:
"../scripts/merge_counts_single.R"
我现在要使用它,但我猜测包含的规则中的通配符范围仍然存在问题。或者也许我做错了。
答案 0 :(得分:0)
使用通配符的想法是为通配符中的每个值调用一个规则。
如果在规则输入中使用expand
函数,则规则将获取所有通配符值并创建字符串列表。这意味着,您的规则只会被调用一次(不是每个通配符值)。默认情况下,expand
使用python itertools函数product,它生成所提供的通配符值的所有组合。
通过这样做,您不能再在规则中使用该通配符。因为当调用该规则时,它会获取所有通配符值并将它们转换为一个列表,该列表将仅提供给您的R脚本一次(不是每个通配符值)。
在您的情况下,使用通配符是不合适的,因为您的merge_count规则将只运行一次(不是每个通配符值)。