我想在数据框中添加一个水平条形图作为列。我可以只重复一个字符,但我想使用unicode第八块字符0x2588:0x258F,以获得更紧凑的表示。我有一个很好的解决方案,但是,我不能连接整数部分与小数部分之间没有间隙。分数unicode字符似乎左对齐,但它并不出来。
library(dplyr)
library(stringr)
intToUtf8_v <- Vectorize(intToUtf8)
bar_chars <-
tibble(amt = (8:1)/8) |>
mutate(bar_val = 1:8+0x2587,
bar_char = stringr::str_trim(intToUtf8_v(bar_val)))
bar_chars
#> # A tibble: 8 × 3
#> amt bar_val bar_char
#> <dbl> <dbl> <chr>
#> 1 1 9608 █
#> 2 0.875 9609 ▉
#> 3 0.75 9610 ▊
#> 4 0.625 9611 ▋
#> 5 0.5 9612 ▌
#> 6 0.375 9613 ▍
#> 7 0.25 9614 ▎
#> 8 0.125 9615 ▏
round_to_frac <- function(value,frac){
round(value*frac)/frac
}
build_bar <- function(value){
whole_part = paste(rep("\U2588",times=floor(value)),
collapse = "")
eighth_part <- bar_chars |>
filter(amt == round_to_frac(value-floor(value),8)) |>
pull(bar_char)
return(paste(whole_part,eighth_part,collapse = ""))
}
# I want to get rid of this gap
build_bar(2.7)
#> [1] "██ ▊"
# It should look like this
#> [1] "██▊"
字符串
1条答案
按热度按时间fnatzsnv1#
嗯,在格式化我的问题时,我发现
paste(x,y,collapse="")
是错误的。paste0
成功了。这是一个简洁的内嵌条形图函数。请注意,使用
data.frame()
print方法进行呈现看起来不稳定,因为字段是右对齐的。cbind
和tibble
给予了预期结果编辑为仅使用Base R。
字符串
创建于2023-07-24与reprex v2.0.2现在我只会等待听到我已经重新发明了轮子。