Как изменить цвет ячейки таблицы Shiny DT на основе формулы, а не значения ячейки? - PullRequest
0 голосов
/ 29 апреля 2020

Мне было интересно, возможно ли изменить цвет фона ячейки таблицы DT не на основе значения ячейки, а на основании разницы между значением ячейки и другим ссылочным номером, предоставленным пользователем. Таким образом, если разница <2, ячейка окрашена в зеленый цвет, если больше 2, красный, et c. Идея состоит в том, чтобы иметь возможность использовать некоторую оценку / формулу, а не просто значение ячейки. </p>

Ниже приведен классический пример использования значения ячейки в качестве критерия, а это не то, что мне нужно. Спасибо!

library(shiny)
library(DT)
#> 
#> Attaching package: 'DT'
#> The following objects are masked from 'package:shiny':
#> 
#>     dataTableOutput, renderDataTable

ui <- shinyUI(fluidPage(

    mainPanel(
      DT::dataTableOutput("table")
    )

))

server <- shinyServer(function(input, output) {
  dfr <- data.frame("x"=c(1, 2, 3),
                    "y"=c(10, 12, 14))

  Reference <- 13

  output$table <- DT::renderDataTable(datatable(dfr) %>% formatStyle('y', backgroundColor = styleEqual(c(10, 12, 14), c('gray', 'yellow', 'red'))))

})

shinyApp(ui = ui, server = server)

1 Ответ

1 голос
/ 29 апреля 2020

Вот возможное решение. Может потребоваться дополнительная настройка, чтобы получить именно то, что вы хотите, но ключевые функции должны быть там. Я использовал пакет formattable , который может вас заинтересовать.

library(shiny)
library(DT)
library(dplyr)
library(formattable)

ui <- shinyUI(fluidPage(

  mainPanel(
    textInput("input", "put number here"),
    DT::dataTableOutput("table")
  )

))

server <- shinyServer(function(input, output) {

   dfr <- data.frame("x"=c(1, 2, 3),
                     "y"=c(10, 12, 14))

  output$table <- DT::renderDataTable(as.datatable(formattable(dfr, list(
    y = formatter("span", 
                  style = y ~ style(
                    color = ifelse(y - as.numeric(input$input) >= 2, "green", ifelse(y - as.numeric(input$input) <= -2, "red", "black"))))
  ))))

})

shinyApp(ui = ui, server = server)
...