r - 在 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:重置单击单元格的值
解决方案
您可以简单地使用单个单元格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)
推荐阅读
- python - 基于值的滚动计算
- java - Minecraft Spigot 的 CloseInventory 有问题
- powerapps - 如何从 Power App Flow 中删除动态内容 HTTP_URIs(从 Power App 询问)
- devextreme - Devextreme Angular 模态对话框
- java - Android/Java:“错误:找不到符号导入 com.here.android.mpa.mapping.SupportMapFragment;”
- javascript - Firebase 函数 - 如何从云函数返回文档快照?
- javascript - 如何避免胜利图表中 x 轴上的重复日期
- python - RuntimeError:执行任何类型的 PIP 操作时都需要 Python 3.5 或更高版本
- deep-learning - 获取 nan 作为损失值
- java - 具有 Maven 依赖项的 Java 项目编译但运行时不选择导入的类