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

时间:2018-12-27 07:18:14

标签: r package devtools

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

> devtools::load_all(".")
Loading VSHunter
Loading required package: NMF
Loading required package: pkgmaker
Loading required package: registry

Attaching package: ‘pkgmaker’

The following object is masked from ‘package:base’:

    isFALSE

Loading required package: rngtools
Loading required package: cluster
NMF - BioConductor layer [OK] | Shared memory capabilities [NO: 
bigmemory] | Cores 7/8
  To enable shared memory capabilities, try: install.extras('
NMF
')

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

> devtools::load_all(".")
Loading VSHunter

> library(VSHunter)
Loading VSHunter

1 个答案:

答案 0 :(得分:1)

在使用devtools::load_all加载程序包时,您可以采取一些措施来减少噪音:

  • devtools::load_all(..., quiet = TRUE)处理此 this 单个程序包的消息,但不一定处理从属程序包
  • 尝试在./R/zzz.R函数的onLoad中显式加载所需的软件包。例如:

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

    (顺便说一句:我在这里使用sapply是为了保持懒惰,并不是说它会增加很多事情。它很可能是for循环,没有任何后果。)

    有关使用requireNamespace代替library的讨论,请参见"library vs require""Writing R Extensions"的声明

      软件包中的

    R代码应调用库或仅需特殊要求。对于“ Depends”中列出的程序包,此类调用将不再需要,因为它们已经在搜索路径中。在使用了功能的函数中,对“建议”中列出的包使用require调用是一种常见的做法,但如今,最好通过::调用来访问此类功能。

    从技术上讲,我们不需要做什么,但是我认为通过强制这样做可以鼓励更安静的操作。 (这是

    请注意,我使用了suppressPackageStartupMessages。 “礼貌的”软件包维护者使用packageStartupMessage而不是message来加载消息:后者要比前者花费更多的工作并且没有多大区别,后者很容易受到抑制,而不会产生意想不到的后果。有很多软件包不这样做,我认为为此提交PR可以解决。

    关于requireNamespace的另一条评论:这意味着那些软件包中的函数将不在R会话的搜索路径中。如果用户将始终使用某些软件包(例如data.tabledplyr),则您可能想用library显式加载它们。再次从“编写R扩展”

      

    字段'Depends'如今应很少使用,仅用于打算放在搜索路径上以使最终用户可以使用其工具的软件包(而不是软件包本身):例如,有意义的是PackageExtra软件包的用户将需要使Package格子的功能可用。

    但是,如果您对自己的软件包比较满意,那么对于所有非基本软件包都使用::表示法。当然,可以使用::来解决问题,但是(1)CRAN检查有时会非常激烈;(2)显式通常是“一件好事(tm)”;(3)它实际上可以使可维护性要容易得多(例如,当从属程序包更改其API / ABI,并且您需要检查对其程序包的所有调用时,与单独搜索每个函数相比,搜索pkgname::要容易得多)。

  • 某些软件包过于宽松地使用.onLoad,它们执行的操作不是严格必需的,并且/或者具有不必要的副作用。为此,您始终可以编写诸如load_deppkgs_silently(updatesearchpath=TRUE)之类的函数,可以在存在选项的情况下手动调用或加载该函数。 (我在这里考虑您的最终用户,我非常喜欢提供灵活性以及能够以自己的方式加载内容的能力。)