Изменить цвет фона выбранной ячейки в таблице Shiny DT на основе правил?

Можно ли изменить цвет фона выбранных пользователем ячеек в таблице DT приложения Shiny на основе программных правил и реактивных ценностей? Я могу настроить цвет выбранных пользователем ячеек ВСЕ с помощью tags$style в приведенном ниже коде. Тем не менее, я хотел бы, чтобы таблица была «Когда пользователь выбирает ячейку, измените цвет фона этой ячейки на белый в нечетных строках или синий в четных строках - если значение ячейки выше не равно« X », тогда вообще не меняй». (на самом деле для этого есть причина!) Конечно, фрейм данных будет меняться в зависимости от ввода пользователя, но эти вводы не включены сюда для экономии места.

library(shiny)
library(DT)

ui <- fluidPage(
  titlePanel("Sample app"),
  tags$style(HTML('table.dataTable td.selected {background-color: blue !important;}')),
  fluidRow(
    column(width = 10,
           DTOutput("maintable")
    ) ) )      

server <- function(input, output, session) {
  
  mydf <- reactive({data.frame(
    matrix(" ", nrow = 10, ncol = 10, dimnames = list(
      seq.int(1,10,1),
      seq.int(1,10,1))
    ))
  })
  
  output$maintable <- renderDT(
    DT::datatable(mydf(), selection = list(target = 'cell'), class = 'table-bordered compact', options = list(
      dom='t',ordering=F, pageLength = nrow(mydf)
    )))
}
shinyApp(ui = ui, server = server)
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Первая часть — выделение цвета по нечетной/четной строке — я воспользовался классом «полосы» и добавил дополнительный CSS для удаления полос, но он включает дополнительный класс, чтобы сказать, является ли строка четной или нечетной. который помогает выбрать разные цвета.

Для if cell = "X" я добавил несколько фиктивных столбцов для ссылки на добавление в класс «без выделения», чтобы при нажатии на него не менялся цвет.

www/style.css

/* Removes background colour of stripes */
table.dataTable.stripe tbody tr.odd, table.dataTable.stripe tbody tr.even {
  background-color: #cccccc; 
}

table.dataTable tr.odd td.selected:not(.no-highlight) {
  background-color: #ffffff !important;
}

table.dataTable tr.even td.selected:not(.no-highlight) {
  background-color: blue !important;
}

table.dataTable tbody tr td.selected.no-highlight {
  background-color: #cccccc !important;
}

приложение.R

library(shiny)
library(DT)

ui <- fluidPage(
  titlePanel("Sample app"),
  tags$link(href = "style.css", rel = "stylesheet"),
  
  fluidRow(
    column(
      width = 10,
      DTOutput("maintable")
    ) 
  ) 
)      

server <- function(input, output, session) {
  
  mydf <- reactive(
    data.frame(
      matrix(
        sample(c("X", " "), 100, TRUE), 
        nrow = 10, 
        ncol = 10, 
        dimnames = list(
          seq.int(1, 10, 1),
          seq.int(1, 10, 1)
        )
      )
    )
  )
  
  trans_df <- reactive(
    cbind(
      mydf(), 
      rbind(" ", mydf()[seq(1, nrow(mydf()) - 1), ])
    )
  )
  
  output$maintable <- renderDT(
    DT::datatable(
      trans_df(), 
      selection = list(target = "cell"), 
      class = "table-bordered compact stripe", 
      options = list(
        dom = "t",
        ordering = FALSE, 
        pageLength = nrow(mydf()),
        columnDefs = list(
          list(
            targets = seq(ncol(mydf())) + ncol(mydf()),
            visible = FALSE
          ),
          list(
            targets = seq(ncol(mydf())),
            createdCell = JS(paste0(
              "function (td, cellData, rowData, row, col) {",
                "if (rowData[col + ", ncol(mydf()), "] === 'X') {",
                  "$(td).addClass('no-highlight');",
                "}",
              "}"
            ))
          )
        )
      )
    )
  )
}

shinyApp(ui = ui, server = server)

Большое спасибо за это. К сожалению, когда я копирую и запускаю весь этот код на своем компьютере, включая style.css в www, цвета у меня не отображаются. (Я не могу добавить скриншот в свой комментарий, но я все еще вижу цвета по умолчанию.)

Sharon 07.05.2022 16:31

Ой, я ошибся с тегом link! Если вы измените src на href, это должно работать

Ashley Baldry 07.05.2022 17:19

Другие вопросы по теме

Как вернуть реактивный фрейм данных из блестящего модуля, который зависит от нажатия кнопки?
Внутренняя ссылка между вкладками на определенный раздел в приложении R Shiny
Добавить входы радиокнопки в пользовательский интерфейс при вводе текста пользователем в R блестящий
Почему эта функция минимальных значений selectizeInput не работает правильно для двузначных чисел, хотя она отлично работает для однозначных чисел?
Пользователь выбирает тему R блестящий ggplot
Блестящий отчет: попытка передать входное значение в качестве параметра для вязания документа .Rmd, но безуспешно
R Блестящий реактивный сюжет из списка списков
Как использовать write.table для загрузки фрейма данных в хороший файл csv/Excel?
Использование URL-адреса для установки значения в блестящем приложении без элемента ввода
Как вставить строку текста поверх таблицы, загруженной с помощью обработчика блестящей загрузки?