Formatr表中的双色彩色工具栏

Formatr表中的双色彩色工具栏,r,formattable,R,Formattable,我有一列是另外两列的总和。我试图得到一个带有两种颜色的color\u条formatter,每种宽度代表单个数字。我尝试通过添加另一个color\u-bar来增加彩色条形码。当时的想法是,大条将是总和列。然后,我只需要另一个酒吧是一个单独的数字,我有两种颜色的酒吧 两个问题:主要是,当我删除~前面的变量并在width块中放置一个列时,R似乎不理解引用。第二,当我尝试看是否有可能有两个色块时,通过调整第二个色块的高度,只显示第二个色块。我已经把代码放在下面了 如果有人有任何提示、想法或解决方案,请告

我有一列是另外两列的总和。我试图得到一个带有两种颜色的
color\u条
formatter,每种宽度代表单个数字。我尝试通过添加另一个
color\u-bar
来增加彩色条形码。当时的想法是,大条将是总和列。然后,我只需要另一个酒吧是一个单独的数字,我有两种颜色的酒吧

两个问题:主要是,当我删除
~
前面的变量并在width块中放置一个列时,R似乎不理解引用。第二,当我尝试看是否有可能有两个色块时,通过调整第二个色块的高度,只显示第二个色块。我已经把代码放在下面了

如果有人有任何提示、想法或解决方案,请告诉我。我对显示两个单独的列如何总结为总列的其他想法持开放态度。当我打字的时候,也许是一个派的闪光

代码如下:

#Make a formattable with a dual color bar

#Packages
library(dplyr)
library(formattable)

#Function
#Ideally, I'd like it to be a function, but can't visualize how to do it.
dualbar <- function(bar1 = "lightgray", bar2 = "lightblue",
                    fun = "comma", digits = 0) {

  fun <- match.fun(fun)
  formatter("span", x ~ fun(x, digits = digits),
            style = y ~ style(
              display = "inline-block",
              direction = "rtl",
              "border-radius" = "4px",
              "padding-right" = "2px",
              "background-color" = csscolor(bar1),
              width = percent(proportion(as.numeric(y), na.rm = TRUE))),
            style = z ~ style(
              display = "inline-block",
              direction = "rtl",
              "border-radius" = "4px",
              "padding-right" = "2px",
              "background-color" = csscolor(bar2),
              width = percent(proportion(as.numeric(z), na.rm = TRUE)),
              height = "10px")
            )
}

#Generate Data
set.seed(1234)
df <- data.frame(month = month.name[1:12],
                 valx = runif(12, 0, 5),
                 valy = runif(12, 2, 7))
df$total <- df$valx + df$valy

tab <- df %>%
  formattable(list(area(row = 1:12, col = 2) ~
                     formatter("span", x ~ comma(x, digits = 0),
                               style = y ~ style(
                                 display = "inline-block",
                                 direction = "rtl",
                                 "border-radius" = "4px",
                                 "padding-right" = "2px",
                                 "background-color" = csscolor("lightgray"),
                                 width = percent(proportion(as.numeric(y), na.rm = TRUE))),
                                 z ~ style(
                                 display = "inline-block",
                                 direction = "rtl",
                                 "border-radius" = "4px",
                                 "padding-right" = "2px",
                                 "background-color" = csscolor("lightblue"),
                                 width = percent(proportion(as.numeric(z), na.rm = TRUE)))
                 ))) %>%
  select(-valx, -valy) %>%
  formattable::as.htmlwidget()

tab
#使用双色条制作formattable
#包裹
图书馆(dplyr)
库(格式化表)
#作用
#理想情况下,我希望它是一个函数,但无法想象如何实现它。

dualbar我想做同样的事情已经有一段时间了,所以这里至少有一个解决方案。与其试图让formattable()识别两个或多个单独的列,不如将相关列连接到单个字符变量中。然后,各种CSS和格式化函数相应地解析这些字符串

最大宽度在这里是硬编码的(=300px),因此您可能希望使其成为反应性的

library(dplyr) # (>= 0.7.0)
library(formattable)
library(glue)
library(stringr)
library(tidyr)
library(scales)

set.seed(1234)
df <- data.frame(month = month.name[1:12],
             valx = runif(12, 0, 5),
             valy = runif(12, 2, 7))
df$total <- df$valx + df$valy


extr <- function(v, n, size = 6){
  str_split_fixed(v, "_", size)[,n] %>% as.double
}

lblue <- csscolor(col2rgb("lightblue"))
lgray <- csscolor(col2rgb("lightgray"))

df %>% mutate(orders = row_number()) %>%
  mutate_if(is.double, funs(lbl = round(., 0))) %>%
  gather(key = item, value = score, valx:total) %>%
  mutate(score = rescale(score, to = c(0,300)),
         score = round(score, 0),
         item = factor(item, levels = c("valx", "valy", "total"))) %>% 
  spread(key = item, value = score) %>%
  arrange(orders) %>%
  mutate(vals = str_c(valx, "_", valy, "_", total, "_", valx_lbl, "_",     
         valy_lbl, "_", total_lbl)) %>%
  select(month, vals) %>% 
  formattable(align = "l", list(
    vals = formatter("span",
                 style = x ~ style(
                   display = "inline-block",
                   direction = "ltr",
                   "border-radius" = "4px",
                   "padding-right" = "2px",
                   "text-indent" =  str_c(extr(x,1)-10, "px"),
                   "background-image" = glue("linear-gradient(to right, 
                    {lgray}, {lgray}), linear-gradient(to right, {lblue}, {lblue})"),
                   "background-repeat" = "no-repeat",
                   "background-position" = str_c("0 0, ", extr(x,1), "px 0"),
                   "background-size" = str_c(extr(x,1), "px 100%, ", extr(x,2), "px 100%"),
                   "width" = str_c(extr(x,3), "px"),
                   "text-align" = "left",
                   "position" = "relative"
                 ), x ~ str_c(extr(x,4), "     ", str_c(extr(x,5))))
  ))
library(dplyr)#(>=0.7.0)
库(格式化表)
图书馆(胶水)
图书馆(stringr)
图书馆(tidyr)
图书馆(比例尺)
种子集(1234)
df%
变异(分数=重新缩放(分数,到=c(0300)),
分数=四舍五入(分数为0),
项目=系数(项目,级别=c(“valx”、“valy”、“total”))%>%
价差(关键=项目,价值=分数)%>%
安排(订单)%>%
变异(VAL=str_c(valx,“,”,valy,“,”,总计,“,”,valx,“,”,
谷(谷),谷(谷),谷(谷)总数%>%
选择(月,VAL)%>%
格式表(align=“l”,列表(
VAL=格式化程序(“span”,
style=x~样式(
display=“inline block”,
direction=“ltr”,
“边界半径”=“4px”,
“右填充”=“2px”,
“文本缩进”=str_c(extr(x,1)-10,“px”),
“背景图像”=胶水(“线性渐变(向右),
{lgray},{lgray}),线性梯度(向右,{lblue},{lblue})”,
“背景重复”=“不重复”,
“背景位置”=str_c(“0 0”,extr(x,1),“px 0”),
“背景尺寸”=str_c(extr(x,1),“px 100%”,extr(x,2),“px 100%”,
“宽度”=str_c(extr(x,3),“px”),
“文本对齐”=“左对齐”,
“位置”=“相对”
),x~str_c(extr(x,4),“”,str_c(extr(x,5)))
))
CSS格式的灵感来自于