[英]In R Shiny, can one interactively highlight cells using DT::dataframe?
使用R Shiny和DT:可以轻松地以交互方式突出显示/取消突出显示单元格吗?
我一直在查看DT输入$ dt_cell_clicked以捕获被单击的行和列。 然后,我计划将该值存储在另一列中,以有条件地突出显示该值(TRUE / FALSE)。
我的问题是:使用其他选项/功能可以做得更好更快吗?
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:单击的单元格的重置值
您可以简单地使用单个单元格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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.