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

时间:2018-01-05 17:08:37

标签: snakemake

我正在使用主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"

我现在要使用它,但我猜测包含的规则中的通配符范围仍然存在问题。或者也许我做错了。

1 个答案:

答案 0 :(得分:0)

使用通配符的想法是为通配符中的每个值调用一个规则。

如果在规则输入中使用expand函数,则规则将获取所有通配符值并创建字符串列表。这意味着,您的规则只会被调用一次(不是每个通配符值)。默认情况下,expand使用python itertools函数product,它生成所提供的通配符值的所有组合。  

通过这样做,您不能再在规则中使用该通配符。因为当调用该规则时,它会获取所有通配符值并将它们转换为一个列表,该列表将仅提供给您的R脚本一次(不是每个通配符值)。

在您的情况下,使用通配符是不合适的,因为您的merge_count规则将只运行一次(不是每个通配符值)。