基于Reactable复选框更改Shiny App中的数据框

问题描述 投票:0回答:1

这个演示 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)
r shiny reactable
1个回答
2
投票

看起来

updateReactable("msg")
不起作用。 解决方法是使用
reactiveValues
作为小标题
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)

output

© www.soinside.com 2019 - 2024. All rights reserved.