“如何有条件地格式化数据表中的字母?

时间:2019-08-26 21:23:03

标签: r

我是R的新手,我目前正在尝试制作一张表格,向我显示2天之间的变化,并且一旦计算出该变化(如果为负,则海变成红色,如果没有,则变为绿色)

enter image description here


title:“ 地区商业消费” 输出:   flexdashboard :: flex_dashboard:     方向:列

vertical_layout:填充

################## librerias #####################
library(flexdashboard)
library(tidyverse)
library(readxl)
library(shiny)
library(formattable)
library(DT)
library(htmlTable)
library(sqldf)
library(ggplot2)
library(data.table)
library(dplyr)
library(tidyr)
library(shinydashboard)

##################  Datos   #######################
base1     <- read_excel("C:/Karlo disco duro/AVANCE.xlsx",sheet = "Base1")
base2     <- read_excel("C:/Karlo disco duro/AVANCE.xlsx",sheet = "Base2")
finmes <- read_excel("C:/Karlo disco duro/AVANCE.xlsx",sheet = "Finmes")

{width = 20%} {width = 6%}

结肠念珠菌病


Green0 = "#DeF7E9"
Green = "#71CA97"
Red = "#ff7f7f"

data1<-subset(base1,select = c("TipoCredito","SaldoCapital"))
data2<-subset(base2,select = c("TipoCredito","SaldoCapital"))
finmes1<-subset(finmes,select = c("TipoCredito","SaldoCapital"))
final1<-data.frame(sqldf(
  "select TipoCredito, sum(SaldoCapital) as SALDO from data1 group by TipoCredito"
))
final2<-data.frame(sqldf(
  "select TipoCredito, sum(SaldoCapital) as SALDO from data2 group by TipoCredito"
))
finmes2<-data.frame(sqldf(
  "select TipoCredito, sum(SaldoCapital) as SALDO from finmes1 group by TipoCredito"
))

tablaa<-data.frame(final1)
tablab<-data.frame(final2)
tablafinmes<-data.frame(finmes2)

final3<-data.frame(sqldf(
  "select A.TipoCredito, A.SALDO as '23Agosto', B.SALDO as '24Agosto', (B.SALDO - A.SALDO) as VARIACION
  from tablaa A
  join tablab B on A.TipoCredito = B.TipoCredito
  group by A.TipoCredito"
))

finalfinmes <- data.frame(sqldf(
  "select F.TipoCredito, F.SALDO as '31Julio', B.SALDO as '24Agosto', (B.SALDO - F.SALDO) as VARIACION
  from tablafinmes F
  join tablab B on F.TipoCredito = B.TipoCredito
  group by F.TipoCredito"
))

my.options <- list (autoWidth = FALSE,
                   searching = FALSE,
                   ordering = FALSE,
                   lengthChange = FALSE,
                   lengthMenu = FALSE,
                   pageLength = FALSE,
                   paging = FALSE,
                   info = FALSE)
##final<-formattable(final3,list(VARIACION = color_tile("red", "green")))

##final3.1<-formattable(final3, list(`VARIACION`=formatter("span", style = x ~ style(color = ifelse(x < 0, "red", "green")))))
##finalfinmes1<-formattable(finalfinmes, list(`VARIACION`=formatter("span", style = x ~ style(color = ifelse(x < 0, "red", "green")))))

Tablafinal<-datatable(final3,options = list(autoWidth = TRUE, columnDefs = 
                      list(list(width = '190px', targets = c(1,2,3,4))),pageLength = 7,searching = TRUE,
                   ordering = TRUE,
                   lengthChange = TRUE,
                   lengthMenu = FALSE,
                   pageLength = FALSE,
                   paging = FALSE,
                   info = FALSE), colnames = c('Tipo de credito','23 de Agosto','24 de Agosto', 'Variacion Diaria')) 

Tablafinalfinmes<-datatable(finalfinmes,options = list(autoWidth = TRUE, columnDefs = 
                      list(list(width = '190px', targets = c(1,2,3,4))),pageLength = 7,searching = TRUE,
                   ordering = TRUE,
                   lengthChange = TRUE,
                   lengthMenu = FALSE,
                   pageLength = FALSE,
                   paging = FALSE,
                   info = FALSE),colnames = c('Tipo de credito','31 de Julio','24 de Agosto', 'Variacion fin de mes'))
##%>% formatStyle('VARIACION',color = ifelse('VARIACION'>0,'Green','Red')))

##Tablafinal$VARIACION <- ifelse(Tablafinal$VARIACION < 0, 1, ifelse(Tablafinal$VARIACION > 0, 2,3))

Tablafinal1<- formatStyle(Tablafinal,
                        columns = c(4),
                        fontFamily = "Arial",
                        fontSize = "16px", 
                        color = ifelse('VARIACION'< -0,'#ed1c16','#0ca649'))
                       ## backgroundColor = styleEqual(c(1, 2,3), c('green', 'yellow','red')))
                        ##color = styleEqual(c(-1,0,1),c('green','blue','Yellow')))

Tablafinalfinmes1<- formatStyle(Tablafinalfinmes,
                        columns = c(4),
                        fontFamily = "Arial",
                        fontSize = "16px",
                        color = ifelse('VARIACION'< -0,'#ed1c16','#0ca649'))

Tablafinal1$VARIACION <- ifelse(Tablafinal1$VARIACION < 0, 1, 
                    ifelse(Tablafinal1$VARIACION > 0, 2))

ab <- Tablafinal1 %>% formatCurrency (c('X23Agosto','X24Agosto','VARIACION'), 's/ ') %>% formatStyle('TipoCredito',target = 'row',backgroundColor = styleEqual(c('CONSUMO NO REVOLVENTE','CONSUMO REVOLVENTE','HIPOTECARIO'),c('#f8fb63','#f8fb63','#f8fb63'))) %>% formatStyle('VARIACION',fontWeight = 'bold',fontSize = "13px") 

##ab1 <- ab %>% formatStyle(columns = c('VARIACION'),valueColumns = c('VARIACION'),target='row',Color = styleEqual(c(-1,1),
##                                                                      c('red','green')))

tf <- Tablafinalfinmes1 %>% formatCurrency (c('X31Julio','X24Agosto','VARIACION'),'s/ ')%>% formatStyle('TipoCredito',target = 'row',backgroundColor = styleEqual(c('CONSUMO NO REVOLVENTE','CONSUMO REVOLVENTE','HIPOTECARIO'),c('#f8fb63','#f8fb63','#f8fb63'))) %>% formatStyle('VARIACION',fontWeight = 'bold',fontSize = "13px")

##ui<- fluidPage (navlistPanel(tabPanel("Variacion Diaria",ab),
##                  tabPanel("Variacion Mensual")))
##ui<-formattable(ab, list(VARIACION = color_tile("red", "green")))
ui<- fluidPage (tabsetPanel(tabPanel("Variacion Diaria",ab),
              tabPanel("Variacion Mensual",tf)))

INICIO

行{.tabset} {width = 80}

ui

1 个答案:

答案 0 :(得分:0)

当前,color = ifelse('VARIACION'< -0,'#ed1c16','#0ca649')正在评估字符串VARIACION是否小于0。虽然这不是一个特别有意义的问题,但R确实将其评估为FALSE(在您所有的情况下),因此将绿色打印为结果。

更一般地说,在这种情况下,您不想使用ifelse()。请改用类似formatStyle('VARIACION', color = styleInterval(0, c("red", "green"))的名称。

此处的键是styleInterval(),它定义间隔的切点和颜色。当您放置一个切割点(例如0)和两种颜色时,它将使用第一种颜色在切割点之前,第二种在切割点之后。但是,您可以有多个间隔(切点> 1)。您只需要一种颜色即可,但切点要多(例如,在下面的示例中尝试使用color = styleInterval(c(0,300000), c("red", "green","blue")))之类的颜色)。

以下是从https://rstudio.github.io/DT/functions.html修改而来的工作示例:

library(DT)
m = cbind(matrix(rnorm(60, 1e5, 1e6), 20), runif(20), rnorm(20, 100))
m[, 1:3] = round(m[, 1:3])
m[, 4:5] = round(m[, 4:5], 7)
colnames(m) = head(LETTERS, ncol(m))
head(m)

datatable(m) %>% 
  formatCurrency(c('A', 'C')) %>% 
  formatStyle('A',  color = styleInterval(0, c("red", "green")))

请进一步注意,使用ifelse()的更正确的实现仍然会失败,因为它返回向量,并且color选项不需要向量(因此,它不会引发错误,也不会绘制) 。同样,请不要在此处使用ifelse()

#this fails
datatable(m) %>% 
  formatCurrency(c('A', 'C')) %>% 
  formatStyle('A',  color = ifelse(m[,"A"] < 0, "red", "green"))