我有一个Nextflow管道,它有两个通道。
- 第一个通道运行并将6个
.tsv
文件输出到名为“results”的文件夹中。 - 第二个通道应该使用所有这些6个
.tsv
文件,并在称为“createReport”的过程中使用R中的knitr创建一个.pdf报告。
我的工作流代码如下所示:
workflow {
inputFileChannel = Channel.fromPath(params.pathOfInputFile, type: 'file') // | collect | createReport // creating channel to pass in input file
findNumOfProteins(inputFileChannel) // passing in the channel to the process
findAminoAcidFrequency(inputFileChannel)
getProteinDescriptions(inputFileChannel)
getNumberOfLines(inputFileChannel)
getNumberOfLinesWithoutSpaces(inputFileChannel)
getLengthFreq(inputFileChannel)
outputFileChannel = Channel.fromPath("$params.outdir.main/*.tsv", type: 'file').buffer(size:6)
createReport(outputFileChannel)
我的“createReport”进程当前如下所示:
process createReport {
module 'R/4.2.2'
publishDir params.outdir.output, mode: 'copy'
output:
path 'report.pdf'
script:
"""
R -e "rmarkdown::render('./createReport.Rmd')"
"""
}
我的'createReport.Rmd'看起来像这样(在Rstudio中测试并给出正确的.pdf输出:
---
title: "R Markdown Practice"
author: "-"
date: "2022-12-08"
output: pdf_document
---
{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(readr)
dataSet <- list.files(path="/Users/-/Desktop/code/nextflow_practice/results/", pattern="*.tsv")
print(dataSet)
for (data in dataSet) {
print(paste("Showing the table for:", data))
targetData <- read.table(file=paste("/Users/-/Desktop/code/nextflow_practice/results/", data, sep=""),
head=TRUE,
nrows=5,
sep="\t")
print(targetData)
if (data == "length_data.tsv") {
data_to_graph <- read_tsv(paste("/Users/-/Desktop/code/nextflow_practice/results/", data, sep=""), show_col_types = FALSE)
plot(x = data_to_graph$LENGTH,y = data_to_graph$FREQ, xlab = "x-axis", ylab = "y-axis", main = "P")
}
writeLines("-----------------------------------------------------------------")
}
编写createReport过程和工作流部分的正确方法是什么,以便能够将6 .tsv输出从第一个通道传递到第二个通道来创建报告?
对不起,我是一个新的Nextflow和文档没有帮助我,因为我希望它!
1条答案
按热度按时间o7jaxewo1#
您的 outputFileChannel 似乎正在尝试访问publishDir中的文件。访问此目录中的文件(即“results”)的问题在于:
文件是以异步方式复制到指定目录中的,因此在流程执行结束时,可能无法立即在发布目录中使用这些文件。因此,其他下游流程不能访问流程发布的文件。
假设您的 inputFileChannel 是一个值通道,您可以使用以下代码。这需要在输出块中声明六个进程的输出(使用
path
限定符)。然后,我们可以混合并收集这些文件。然后,您的Rmd文件和TSV文件列表可以传递到您的 createReport 进程。请注意,如果将Rmd移动到管道项目的基目录中(例如,与您的main.nf
脚本在同一目录中),您可以将其与您的工作流一起分发。通过在通道上提供Rmd,此方法可确保在作业运行时将其分段到进程工作目录中。例如:第一个
请注意,上面的 createReport 进程将把输入TSV文件存放在进程工作目录中名为'input_dir'的文件夹下。如果愿意,您可以更改此设置,但我认为这会使工作目录保持整洁。只需确保修改您的Rmd脚本以指向此文件夹。例如,您可以选择使用如下内容:
或者甚至: