首页 > 解决方案 > 在 R Shiny 中,可以使用 DT::dataframe 以交互方式突出显示单元格吗?

问题描述

使用 R Shiny 和 DT:可以轻松地以交互方式突出/取消突出显示单元格吗?

我一直在查看 DT input$dt_cell_clicked 以捕捉被点击的行和列。然后我计划将该值存储在另一列中,以有条件地突出显示该值(真/假)。

我的问题是:使用另一种选项/功能可以做得更好+更快吗?

library(shiny)
library(shinyjs)

library(dplyr)
library(DT)

options(DT.options = list(pageLength = 5))
df = as.data.frame(
        cbind(
                matrix(round(rnorm(50), 3), 10),
                sample(0:1, 10, TRUE),
                rep(FALSE, 10)
        )
)
# getwd()
setwd(here::here())
# write.csv(df, "data/df_test.csv")

ui <- fluidPage(
        h2("Last clicked:"),
        verbatimTextOutput("last_clicked"),
        actionButton("reset", "Reset clicked value"),
        h2("Datatable:"),
        DT::dataTableOutput("dt"),
        useShinyjs(),
        extendShinyjs(text = paste0("shinyjs.resetDTClick = function() { Shiny.onInputChange('dt_cell_clicked', null); }"))
)

server <- function(input, output) {

        # the last clicked value
        output$last_clicked <- renderPrint({
                str(input$dt_cell_clicked)
        })

        df_new <- reactive({

                # res <- read.csv("data/df_test.csv")
                res <- df
                res
        })

        output$dt <- DT::renderDataTable({
                # DT::datatable(head(mtcars, 2))
                DT::datatable(df_new(), select = "none", editable = TRUE) %>% formatStyle(
                        'V1', 'V6',
                        backgroundColor = styleEqual(c(0, 1), c('gray', 'yellow'))
                )
        })

        observeEvent(input$dt_cell_clicked, {
                validate(need(length(input$dt_cell_clicked) > 0, ''))
                # alert("You clicked something!")

                if(!is.null(input$dt_cell_clicked)){
                        # df[input$dt_cell_clicked$row, input$dt_cell_clicked$column] <- ifelse(0, 1, 0)
                        cat("changing value")
                        df_test <- df_new()
                        df_test[input$dt_cell_clicked$row, input$dt_cell_clicked$column] <- ifelse(0, 1, 0)
                        write.csv(df_test, "data/df_test.csv")
                        rm(df_test)
                        # i
                }
        })

        # use dt_cell_clicked to infer on bool cell

        # df_new <- eventReactive(input$dt_cell_clicked, {
        # df_new <- reactive({
        #
        # })

        observeEvent(input$reset, {
                js$resetDTClick()
        })
}

shinyApp(ui, server)

预期(尚未实现):单击单元格突出显示/取消突出显示时。

此代码混合来自: 如何根据其值更改 R Shiny 数据表的单元格的单元格颜色? DataTables DT:重置单击单元格的值

标签: rshiny

解决方案


您可以简单地使用单个单元格selection突出显示:

library(shiny)
library(DT)

options(DT.options = list(pageLength = 5))

DF = as.data.frame(
  cbind(
    matrix(round(rnorm(50), 3), 10),
    sample(0:1, 10, TRUE),
    rep(FALSE, 10)
  )
)

ui <- shinyUI(
  fluidRow(
    tags$style(HTML('table.dataTable tr.selected td, table.dataTable td.selected {background-color: lightgreen !important;}')),
    DT::dataTableOutput("myDT")
  )
)

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

  output$myDT <- DT::renderDataTable({
    DT::datatable(DF, selection = list(mode="single", target="cell"), editable = TRUE) %>% formatStyle(
      'V1', 'V6',
      backgroundColor = styleEqual(c(0, 1), c('gray', 'yellow'))
    )
  })

})

shinyApp(ui, server)

推荐阅读