生成加载库的示例时正确使用 reprex 包

Properly using reprex package when generating examples that load libraries

我想在生成使用多个包的 answer/question1 时使用 reprex 包。假设我要提供以下答案

library("gdata")
dfA <- data.frame(colA = c(1, 2), colB = c(3, 4))
ls()
mv(from = "dfA", to = paste0("df", "B"))
ls()

如果我将此代码直接传递给 reprex,输出将如下所示:

library("gdata")
#> gdata: read.xls support for 'XLS' (Excel 97-2004) files ENABLED.
#> 
#> gdata: Unable to load perl libaries needed by read.xls()
#> gdata: to support 'XLSX' (Excel 2007+) files.
#> 
#> gdata: Run the function 'installXLSXsupport()'
#> gdata: to automatically download and install the perl
#> gdata: libaries needed to support Excel XLS and XLSX formats.
#> 
#> Attaching package: 'gdata'
#> The following object is masked from 'package:stats':
#> 
#>     nobs
#> The following object is masked from 'package:utils':
#> 
#>     object.size
#> The following object is masked from 'package:base':
#> 
#>     startsWith
dfA <- data.frame(colA = c(1, 2), colB = c(3, 4))
ls()
#> [1] "dfA"
mv(from = "dfA", to = paste0("df", "B"))
ls()
#> [1] "dfB"

reprex package (v2.0.1)

于 2022-03-23 创建

丢失了与包加载相关的无关信息。另一种方法是抑制包启动消息:

suppressPackageStartupMessages(library("gdata"))
dfA <- data.frame(colA = c(1, 2), colB = c(3, 4))
ls()
#> [1] "dfA"
mv(from = "dfA", to = paste0("df", "B"))
ls()
#> [1] "dfB"

reprex package (v2.0.1)

于 2022-03-23 创建

上面的 reprex 输出是通过以下方式生成的:

library("reprex")
reprex(x = {
    suppressPackageStartupMessages(library("gdata"))
    dfA <- data.frame(colA = c(1, 2), colB = c(3, 4))
    ls()
    mv(from = "dfA", to = paste0("df", "B"))
    ls()

}, venue = "so")

问题

有没有更简洁的方法来做到这一点? Reprex 提供 tidyverse_quiet 但我想知道是否有一种智能方法可以“扩展”该参数以应用于多个包?在加载多个包的假设答案中,我想避免多次编写 suppressPackageStartupMessages 只是为了抑制不必要的输出。

当从各种包中调用多个函数时,编写 package::function 可能很繁重。


1作为参考,我在贡献 to .

后开始思考

您不需要 运行 suppressPackageStartupMessages 多次。你可以做到

suppressPackageStartupMessages({
  library(gdata)
  library(tidyverse)
})
#> Warning: package 'tidyr' was built under R version 4.1.2
#> Warning: package 'dplyr' was built under R version 4.1.2

reprex package (v2.0.1)

于 2022-03-23 创建

您仍然会看到警告,但大多数垃圾信息都被抑制了。

对于 SO,您可以将其缩短为

suppressMessages({
  library(gdata)
  library(tidyverse)
})

我不会经常这样做,因为也许有些包裹有有用的信息。它也可能给新手错误的想法,让他们在自己的代码中使用它,而错过了那些信息。

如果你想要少一些压制,可以使用

library(gdata, quietly = TRUE)
library(tidyverse, quietly = TRUE)

要考虑的另一个选项是在 reprex 中使用 knitr 块选项。显然,这些将适用于块中的所有代码,尽管您可以使用多个块来进行更多控制。

reprex(x = {
  #+ chunk1, message = FALSE
  library("gdata")
  dfA <- data.frame(colA = c(1, 2), colB = c(3, 4))
  ls()
  mv(from = "dfA", to = paste0("df", "B"))
  ls()
  }, venue = "so")

给出:

library("gdata")
dfA <- data.frame(colA = c(1, 2), colB = c(3, 4))
ls()
#> [1] "dfA"
mv(from = "dfA", to = paste0("df", "B"))
ls()
#> [1] "dfB"

reprex package (v2.0.1)

于 2022-03-23 创建