Home > Enterprise >  cli::cli_warn() - getting a bulleted list in the output
cli::cli_warn() - getting a bulleted list in the output

Time:08-27

I've got a scenario where I'd like to format the output of a warning message using the cli package and need it to be able to print a bulleted list of warnings of variable length. If the length is known ahead of time, I can just supply the bullets explicitly, but I've been struggling to figure out how to apply bullets when the length isn't known ahead of time. Any help would be appreciated!

beep_boop <- function(msg) {
  
  if (class(msg) != "character") cli::cli_warn(c("Oh no!", "x" = letters[1:3]))
  tibble::as_tibble(mtcars)
  
}

# this doesn't work as expected :(
beep_boop(3)
#> Warning: Oh no!
#> a
#> b
#> c
#> # A tibble: 32 × 11
#>      mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#>    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
#>  2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
#>  3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
#>  4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
#>  5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
#>  6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
#>  7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
#>  8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
#>  9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
#> 10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
#> # … with 22 more rows
#> # ℹ Use `print(n = ...)` to see more rows

# what I'd like to see:
cli::cli_warn(c("Oh no!", 
                "x" = letters[1],
                "x" = letters[2],
                "x" = letters[3]))
#> Warning: Oh no!
#> ✖ a
#> ✖ b
#> ✖ c

Created on 2022-08-25 by the reprex package (v2.0.1)

CodePudding user response:

You need to create the same shape of the vector. The desired vector has multiple elements with the same name. A more direct translation would be

beep_boop <- function(msg) {
  
  if (class(msg) != "character") cli::cli_warn(c("Oh no!", setNames(letters[1:msg], rep("x",msg))))
  tibble::as_tibble(mtcars)
}

Here I used msg as the number of items in the list to show. You just need to give them all the name x= which is done here with setNames

  • Related