R包开发如何抑制从依赖包生成的消息?

Shi*_*ang 3 r devtools package

我正在开发一个名为VSHunterand need NMFpackage 作为依赖项的 R 包,但是,每次加载 NMF 都会抛出许多消息,我不知道如何抑制它们。

\n\n
> devtools::load_all(".")\nLoading VSHunter\nLoading required package: NMF\nLoading required package: pkgmaker\nLoading required package: registry\n\nAttaching package: \xe2\x80\x98pkgmaker\xe2\x80\x99\n\nThe following object is masked from \xe2\x80\x98package:base\xe2\x80\x99:\n\n    isFALSE\n\nLoading required package: rngtools\nLoading required package: cluster\nNMF - BioConductor layer [OK] | Shared memory capabilities [NO: \nbigmemory] | Cores 7/8\n  To enable shared memory capabilities, try: install.extras(\'\nNMF\n\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

我不想打扰用户并期望结果

\n\n
> devtools::load_all(".")\nLoading VSHunter\n
Run Code Online (Sandbox Code Playgroud)\n\n

\n\n
> library(VSHunter)\nLoading VSHunter\n
Run Code Online (Sandbox Code Playgroud)\n

r2e*_*ans 5

您可以采取以下措施来减少加载包时的噪音devtools::load_all

\n\n
    \n
  • devtools::load_all(..., quiet = TRUE)处理单个包的消息,但不一定是依赖包
  • \n
  • ./R/zzz.R尝试显式加载所需的包onLoad。例如:

    \n\n
    .onLoad <- function(libname, pkgname) {\n  invisible(suppressPackageStartupMessages(\n    sapply(c("tibble", "purrr", "dplyr", "tidyr", "ggplot2", "data.table"),\n           requireNamespace, quietly = TRUE)\n  ))\n}\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    (顺便说一句:我sapply在这里使用是为了懒惰,并不是说它增加了很多东西。它很容易成为一个for没有任何后果的循环。)

    \n\n

    有关使用requireNamespace代替的讨论library,请参阅“library vs require”“Writing R Extensions”其中指出

    \n\n
    \n

    包中的 R 代码应该调用库或仅在例外情况下需要。\xe2\x80\x98Depends\xe2\x80\x99 中列出的包永远不需要此类调用,因为它们已经在搜索路径上。过去的常见做法是在使用其功能的函数中对 \xe2\x80\x98Suggests\xe2\x80\x99 中列出的包使用 require 调用,但现在最好通过 :: 调用来访问此类功能。

    \n
    \n\n

    我们正在做的事情在技术上不是必需的,但我认为通过强制这样做,这是鼓励更安静的操作。(这得益于

    \n\n

    请注意,我使用了suppressPackageStartupMessages. “有礼貌的”包维护者使用packageStartupMessage而不是message用于加载消息:后者需要更多的工作,并且比前者的区别性要小得多,很容易被抑制,而不会产生意想不到的后果。有很多软件包不这样做,我认为提交 PR 来修复是公平的。

    \n\n

    另一个评论requireNamespace:这意味着这些包中的函数不会出现在 R 会话的搜索路径中。如果用户将始终使用某些包(例如,data.tabledplyr),那么您可能需要使用 显式加载它们library。再次来自“编写 R 扩展” :

    \n\n
    \n

    字段 \xe2\x80\x98Depends\xe2\x80\x99 现在应该很少使用,仅适用于那些打算放在搜索路径上的包,以使最终用户可以使用其功能(而不是包本身):例如,包latticeExtra的用户希望包lattice的功能可用是有道理的。

    \n
    \n\n

    但是,如果您对自己的包很满意,那么您::无论如何都会对所有非基础包使用符号。当然有一些方法可以绕过使用::,但是 (1) CRAN 检查有时相当密集,(2) 显式通常是“一件好事 (tm)”,(3) 它实际上可以使可维护性变得更容易(例如例如,当依赖包更改其 API/ABI 时,您需要检查对其包的所有调用,其中搜索pkgname::比单独搜索每个函数要容易得多)。

  • \n
  • 有些软件包使用.onLoad得太随意,做一些并非严格必要的事情和/或产生不必要的副作用。为此,您始终可以编写一个函数,例如load_deppkgs_silently(updatesearchpath=TRUE)可以手动调用或在存在选项的情况下加载的函数。(我在这里考虑的是您的最终用户,我非常热衷于提供灵活性和按照我的方式加载内容的能力。)

  • \n
\n