groovy 如何将输出从一个Nextflow Channel传递到另一个并运行.Rmd文件?

zd287kbt  于 2022-12-11  发布在  其他
关注(0)|答案(1)|浏览(156)

我有一个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和文档没有帮助我,因为我希望它!

o7jaxewo

o7jaxewo1#

您的 outputFileChannel 似乎正在尝试访问publishDir中的文件。访问此目录中的文件(即“results”)的问题在于:
文件是以异步方式复制到指定目录中的,因此在流程执行结束时,可能无法立即在发布目录中使用这些文件。因此,其他下游流程不能访问流程发布的文件。
假设您的 inputFileChannel 是一个值通道,您可以使用以下代码。这需要在输出块中声明六个进程的输出(使用path限定符)。然后,我们可以混合并收集这些文件。然后,您的Rmd文件和TSV文件列表可以传递到您的 createReport 进程。请注意,如果将Rmd移动到管道项目的基目录中(例如,与您的main.nf脚本在同一目录中),您可以将其与您的工作流一起分发。通过在通道上提供Rmd,此方法可确保在作业运行时将其分段到进程工作目录中。例如:
第一个
请注意,上面的 createReport 进程将把输入TSV文件存放在进程工作目录中名为'input_dir'的文件夹下。如果愿意,您可以更改此设置,但我认为这会使工作目录保持整洁。只需确保修改您的Rmd脚本以指向此文件夹。例如,您可以选择使用如下内容:

dataSet <- list.files(path="./input_dir", pattern="*.tsv")

或者甚至:

dataSet <- list.files(pattern="*.tsv", recursive=TRUE)

相关问题