您可以静默安装 Bioconductor 软件包吗?

Can you silently install Bioconductor packages?

我正在 Snakemake 中编写调用 R 脚本的管道。这个 R 脚本有自己的环境,里面有 r-baser-ggplot2r-biocmanager。我还需要可以用 biocmanager 安装的软件包 ggbio。我想在调用脚本时静默安装这个包,因为我不想让它淹没我的终端。有没有办法做到这一点?我现在有这个,但这仍然会向终端输出分期付款信息:

if(!require(ggbio, quietly=TRUE)){  # if the package is not there, install it
  BiocManager::install("ggbio")
  library(ggbio)
}
...

我也试过这个我看到了 here:

if(!suppressMessages(suppressWarnings(require(ggbio, quietly=TRUE)))){
  BiocManager::install("ggbio")
  library(ggbio)
}

# OR
if(!require(ggbio, quietly=TRUE)){
  suppressMessages(suppressWarnings(BiocManager::install("ggbio")))
  library(ggbio)
}
...

但这也仍然输出到终端。似乎也没有办法给出像 quietly=TRUEBiocManager::install("ggbio").

这样的论点

编辑: invisible()capture.output()sink() 按照建议 也不起作用:

# invisible(capture.output()) around install
if(!require(ggbio, quietly=TRUE)){
  invisible(capture.output(BiocManager::install("ggbio")))  # doesn't work
}

# invisible(capture.output()) around entire if.
invisible(capture.output(if(!require(ggbio, quietly=TRUE)){  # doesn't work
  BiocManager::install("ggbio")
}))

# sink() (Linux)
sink("/dev/null")  # doesn't work
if(!require(ggbio, quietly=TRUE)){
  BiocManager::install("ggbio")
}
sink()

# only invisible()
if(!require(ggbio, quietly=TRUE)){
  invisible(BiocManager::install("ggbio"))  # doesn't work
}

编辑 2: 我了解到 Bioconductor 包在 bioconda 频道中可用,所以如果你像我一样使用 environment.yaml 文件,你可以像这样列出 Bioconductor 包:

channels:
 - conda-forge
 - bioconda
 - defaults
dependencies:
 - r-base=4.1.1
 - r-ggplot2=3.3.5
 - bioconductor-ggbio

如果您必须安静地安装软件包,您可以这样做:

suppressMessages({
if (!requireNamespace("ggbio", quietly = TRUE))
    BiocManager::install("ggbio", quiet = TRUE)
})

但是查看安装是否有问题总是一个好主意。