我正在开发一个名为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
答案 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.table
或dplyr
),则您可能想用library
显式加载它们。再次从“编写R扩展” :
字段'Depends'如今应很少使用,仅用于打算放在搜索路径上以使最终用户可以使用其工具的软件包(而不是软件包本身):例如,有意义的是PackageExtra软件包的用户将需要使Package格子的功能可用。
但是,如果您对自己的软件包比较满意,那么对于所有非基本软件包都使用::
表示法。当然,可以使用::
来解决问题,但是(1)CRAN检查有时会非常激烈;(2)显式通常是“一件好事(tm)”;(3)它实际上可以使可维护性要容易得多(例如,当从属程序包更改其API / ABI,并且您需要检查对其程序包的所有调用时,与单独搜索每个函数相比,搜索pkgname::
要容易得多)。
某些软件包过于宽松地使用.onLoad
,它们执行的操作不是严格必需的,并且/或者具有不必要的副作用。为此,您始终可以编写诸如load_deppkgs_silently(updatesearchpath=TRUE)
之类的函数,可以在存在选项的情况下手动调用或加载该函数。 (我在这里考虑您的最终用户,我非常喜欢提供灵活性以及能够以自己的方式不加载内容的能力。)