Shi*_*ang 3 r devtools package
我正在开发一个名为VSHunterand need NMFpackage 作为依赖项的 R 包,但是,每次加载 NMF 都会抛出许多消息,我不知道如何抑制它们。
> 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\')\nRun Code Online (Sandbox Code Playgroud)\n\n我不想打扰用户并期望结果
\n\n> devtools::load_all(".")\nLoading VSHunter\nRun Code Online (Sandbox Code Playgroud)\n\n和
\n\n> library(VSHunter)\nLoading VSHunter\nRun Code Online (Sandbox Code Playgroud)\n
您可以采取以下措施来减少加载包时的噪音devtools::load_all:
devtools::load_all(..., quiet = TRUE)处理该单个包的消息,但不一定是依赖包./R/zzz.R尝试显式加载所需的包onLoad。例如:
.onLoad <- function(libname, pkgname) {\n invisible(suppressPackageStartupMessages(\n sapply(c("tibble", "purrr", "dplyr", "tidyr", "ggplot2", "data.table"),\n requireNamespace, quietly = TRUE)\n ))\n}\nRun Code Online (Sandbox Code Playgroud)\n\n(顺便说一句:我sapply在这里使用是为了懒惰,并不是说它增加了很多东西。它很容易成为一个for没有任何后果的循环。)
有关使用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请注意,我使用了suppressPackageStartupMessages. “有礼貌的”包维护者使用packageStartupMessage而不是message用于加载消息:后者需要更多的工作,并且比前者的区别性要小得多,很容易被抑制,而不会产生意想不到的后果。有很多软件包不这样做,我认为提交 PR 来修复是公平的。
另一个评论requireNamespace:这意味着这些包中的函数不会出现在 R 会话的搜索路径中。如果用户将始终使用某些包(例如,data.table或dplyr),那么您可能需要使用 显式加载它们library。再次来自“编写 R 扩展” :
\n\n\n字段 \xe2\x80\x98Depends\xe2\x80\x99 现在应该很少使用,仅适用于那些打算放在搜索路径上的包,以使最终用户可以使用其功能(而不是包本身):例如,包latticeExtra的用户希望包lattice的功能可用是有道理的。
\n
但是,如果您对自己的包很满意,那么您::无论如何都会对所有非基础包使用符号。当然有一些方法可以绕过使用::,但是 (1) CRAN 检查有时相当密集,(2) 显式通常是“一件好事 (tm)”,(3) 它实际上可以使可维护性变得更容易(例如例如,当依赖包更改其 API/ABI 时,您需要检查对其包的所有调用,其中搜索pkgname::比单独搜索每个函数要容易得多)。
有些软件包使用.onLoad得太随意,做一些并非严格必要的事情和/或产生不必要的副作用。为此,您始终可以编写一个函数,例如load_deppkgs_silently(updatesearchpath=TRUE)可以手动调用或在存在选项的情况下加载的函数。(我在这里考虑的是您的最终用户,我非常热衷于提供灵活性和不按照我的方式加载内容的能力。)
| 归档时间: |
|
| 查看次数: |
796 次 |
| 最近记录: |