如何解决Snakemake中R脚本通配符使用的invalid参数报错?
问题根源
你猜的没错——当你在rule的input和output中使用expand()时,Snakemake会把所有匹配的文件路径打包成一个列表传递给R脚本。而read.table()只能接收单个文件路径作为参数,无法处理列表,因此抛出invalid 'description' argument错误。
解决方法
方法1:使用通配符规则(推荐)
这是Snakemake处理批量任务的标准方式,让Snakemake自动为每个tables值生成独立任务,逐个调用脚本处理:
修改Snakemake规则,去掉expand(),直接用通配符{tables}:
rule somerule: input: tables = "results/{tables}_table.txt", output: edit= "results/{tables}_edited.txt", conda: "../envs/r.yaml" script: "../scripts/script.R"
你的R脚本不需要任何修改,此时snakemake@input[["tables"]]会被替换为单个文件路径,和你单独运行脚本时的逻辑完全一致。Snakemake会自动识别tables的可能取值(从输出文件或其他规则推导),并行处理每个任务。
方法2:修改R脚本批量处理(不推荐)
如果确实需要在一个脚本里处理所有文件(仅适用于必须批量操作的场景),需要遍历输入列表,逐个处理并对应输出:
修改R脚本如下:
# 遍历每个输入-输出对 for (idx in seq_along(snakemake@input[["tables"]])) { tab <- read.table(snakemake@input[["tables"]][idx], sep = "\t", header = TRUE) edit <- some_function(tab) write.table( edit, file = snakemake@output[["edit"]][idx], sep = "\t", quote = FALSE, row.names = TRUE, col.names = TRUE ) }
这种方法会让Snakemake只运行一次脚本处理所有文件,无法利用Snakemake的并行化能力,因此除非有特殊需求,不建议使用。
内容的提问来源于stack exchange,提问作者Theresa
相关产品推荐
相关产品推荐

