R中S4 snakemake对象中缺少通配符

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

我正在运行一个包含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_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"