r - 基于 Reactable 复选框更改 Shiny App 中的数据框
问题描述
这个演示 R 脚本有两个数据框,由两个 Reactable 表显示。当 Iris 表中的复选框数量超过 2 时,表中的警告消息msg
应该会发生变化。
这是我的非工作尝试
library("reactable")
library("shiny")
library("tidyverse")
max_num_boxes_checked <- 2
warn_last_update_df <- tibble(
warn_msg = "Not too many selected",
last_updated_msg = "Last updated: Sept 23, 2020"
)
ui <- fluidPage(
reactableOutput("msg"),
reactableOutput("table")
)
server <- function(input, output, session){
output$msg <- renderReactable({
reactable(warn_last_update_df,
columns = list(
"last_updated_msg" = colDef(
align = "right",
name = ""
),
"warn_msg" = colDef(
name = ""
)
))
})
output$table <- renderReactable({
reactable(iris,
onClick = "select",
selection = "multiple")
})
observeEvent(input$table,
{
state <- req(getReactableState("table"))
# Get vector of which boxes are checked (their number)
boxes_checked <- state[[4]]
# Number of boxes checked
num_boxes_checked <- (length(boxes_checked))
# Change warning msg based on num checkboxes > 2
if (num_boxes_checked > max_num_boxes_checked) {
warn_last_update_df$warn_msg <- paste("Wow! More than ", max_num_boxes_checked, "checked")
updateReactable("msg")
}
}
)
}
shinyApp(ui, server)
解决方案
看来这updateReactable("msg")
行不通。一种解决方法是使用reactiveValues
tibble warn_last_update_df
。这是一个工作代码。
max_num_boxes_checked <- 2
warn_last_update_df <- tibble(
warn_msg = "Not too many selected",
last_updated_msg = "Last updated: Sept 26, 2020"
)
ui <- fluidPage(
reactableOutput("msg"),
reactableOutput("table")
)
server <- function(input, output, session){
selected <- reactiveValues(vec=NULL)
DF1 <- reactiveValues(data=NULL)
observe({
selected$vec <- getReactableState("table", "selected")
DF1$data <- warn_last_update_df
})
output$msg <- renderReactable({
reactable(DF1$data, #warn_last_update_df,
columns = list(
"last_updated_msg" = colDef(
align = "right",
name = ""
),
"warn_msg" = colDef(
name = ""
)
))
})
output$table <- renderReactable({
reactable(iris,
onClick = "select",
selection = "multiple")
})
observeEvent(selected$vec,{
# Change warning msg based on num checkboxes > 2
if (length(selected$vec) > max_num_boxes_checked) {
#warn_last_update_df$warn_msg <- paste0("Wow! More than 2 rows checked")
#updateReactable("msg",selected = NA) ## this is not working
DF1$data[1,1] <- paste0("Wow! More than ", max_num_boxes_checked, " rows checked")
}
})
}
shinyApp(ui, server)
推荐阅读
- javascript - 重新加载内容功能正在破坏代码
- sql - 如何识别仅在先前细分之后 6 个月内开始的最新细分?
- amazon-web-services - IP tables for ECS instance
- python - 如何在循环中使用熊猫字符串包含(str.contain)?
- javascript - window.requestAnimationFrame() 是如何工作的?
- javascript - 从 Firebase 上传和下载
- laravel - Laravel:从数据库中显示 HTML 代码和 Laravel 语法?
- javafx - JavaFX中单元格的依赖于单元格的外观
- jquery - 使用后退按钮隐藏显示 li 子元素
- ibm-mq - 在 IBM MQ 中执行读取操作后,消息是否会从队列中删除?