R中S4 snakemake对象中缺少通配符
我正在运行一个包含rules文件夹中规则的主Snakefile工作流,并从这些包含的规则中调用RScript 以下是几行及其特定文件: 蛇形档案:R中S4 snakemake对象中缺少通配符,snakemake,Snakemake,我正在运行一个包含rules文件夹中规则的主Snakefile工作流,并从这些包含的规则中调用RScript 以下是几行及其特定文件: 蛇形档案: samples = pd.read_table("samples.csv", header=0, sep=',', index_col=0) rule extract: input: 'summary/umi_expression_matrix.tsv' include: "rules/extract_expression_s
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"
规则/提取\u表达式\u 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"
脚本/合并\u计数\u单个。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')
给出:
<class 'snakemake.io.Wildcards'>
done
我现在要用这个,但我猜在包含的规则中通配符的范围仍然存在问题。或者我做错了。使用通配符的想法是为通配符中的每个值调用一个规则
如果在规则输入中使用
expand
函数,则规则将获取所有通配符值并创建字符串列表。这意味着,您的规则只会被调用一次(而不是针对每个通配符值)。默认情况下,expand
使用python itertools函数生成所提供通配符值的所有组合。
这样,您就不能再在规则中使用该通配符了。因为当调用该规则时,它会获取所有通配符值,并将它们转换为一个列表,该列表将只提供给R脚本一次(而不是每个通配符值)。
在您的情况下,使用通配符是不合适的,因为合并计数规则将只运行一次(不是针对每个通配符值)。
您应该使用
snakemake@wildcards[['sample']
而不是snakemake@wildcards.sample
,如snakemake文档中所述。但在这种情况下,这也不起作用,因为extend函数会创建一个包含所有通配符值的字符串列表,并使通配符无效。我想我会用一个恰当的答案进一步阐述。
<class 'snakemake.io.Wildcards'>
done
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"