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