1

下面的代码生成下表:

在此处输入图像描述

目标是能够在制造商列中选择一个类别(例如/别克),并选择 4 款车型(2 款来自中型车,2 款来自大型车)。现在,全选功能仅适用于按类型分组的模型。

我尝试了什么: ActionButton 和 observeEvent updateReactable("table", selected = ...)问题是我想让用户能够从多个制造商类别中选择所有 模型(例如/用户选择 Acura 下的所有行和别克下的所有行)。我尝试过的操作按钮仅适用于一个类别,如果单击另一个按钮,表格会重新设置。如果有帮助,很高兴包含这个失败的代码。

代码:

library(shiny)
library(reactable)

data <- MASS::Cars93[, 1:7]

ui <- fluidPage(
  # actionButton("select_btn", "Select rows"),
  # actionButton("clear_btn", "Clear selection"),
  # actionButton("expand_btn", "Expand rows"),
  # actionButton("collapse_btn", "Collapse rows"),
  # actionButton("page_btn", "Change page"),
  # selectInput("filter_type", "Filter type", unique(data$Type), multiple = TRUE),
  reactableOutput("table")
)

server <- function(input, output) {
  output$table <- renderReactable({
    reactable(
      data,
      filterable = TRUE,
      searchable = TRUE,
      selection = "multiple",
      groupBy = c("Manufacturer",
                  "Type")

    )
  })
  
  # observeEvent(input$select_btn, {
  #   # Select rows
  #   updateReactable("table", selected = c(1, 3, 5))
  # })
  # 
  # observeEvent(input$clear_btn, {
  #   # Clear row selection
  #   updateReactable("table", selected = NA)
  # })
  # 
  # observeEvent(input$expand_btn, {
  #   # Expand all rows
  #   updateReactable("table", expanded = TRUE)
  # })
  # 
  # observeEvent(input$collapse_btn, {
  #   # Collapse all rows
  #   updateReactable("table", expanded = FALSE)
  # })
  # 
  # observeEvent(input$page_btn, {
  #   # Change current page
  #   updateReactable("table", page = 3)
  # })
  # 
  # observe({
  #   # Filter data
  #   filtered <- if (length(input$filter_type) > 0) {
  #     data[data$Type %in% input$filter_type, ]
  #   } else {
  #     data
  #   }
  #   updateReactable("table", data = filtered)
  # })
}

shinyApp(ui, server)
4

2 回答 2

0

也许你正在寻找这个

library(shiny)
library(reactable)

data <- MASS::Cars93[, 1:7]

ui <- fluidPage(
  selectInput("filter_Man", "Filter Manufacturer", unique(data$Manufacturer), multiple = TRUE),
  reactableOutput("table")
)

server <- function(input, output) {
  
  filtered_df <- eventReactive(input$filter_Man, {
    if (length(input$filter_Man) > 0) {
      data[data$Manufacturer %in% input$filter_Man, ]
    } else {data}
  }) 
  
  output$table <- renderReactable({
    reactable(
      filtered_df(),
      filterable = TRUE,
      searchable = TRUE,
      selection = "multiple",
      groupBy = c("Manufacturer",
                  "Type")
      
    )
  })

}

shinyApp(ui, server)
于 2022-01-15T02:34:26.740 回答
0

我找到了一个可行的解决方案

问题:我试图让用户能够选择给定类型组中的所有模型,此外还可以选择更大的制造商组中的所有模型。

我的解决方案:用户可以选择不同的制造商filter_man,并将其存储在select_man.

如果用户开始选择(通过复选框)模型,则存储在selected. 如果省略此项,则如果用户进行了单独的选择,然后决定要从整个制造商组中选择模型,则将删除单独的选择,只留下来自 的选择select_man。这就是为什么obsereEvent包括selected()(单个电池选择)和select_man()(来自特定制造商的所有型号)

代码:

library(shiny)
library(reactable)

data <- MASS::Cars93[, 1:7]

ui <- fluidPage(
  selectInput("filter_man", "Manufacturer:", unique(data$Manufacturer), multiple = TRUE),
  actionButton("selections", "Select Manufacturer",class ="btn btn-primary btn-md"),
  reactableOutput("table")
)

server <- function(input, output) {
  
  
  output$table <- renderReactable({
    reactable(
      data,
      filterable = TRUE,
      searchable = TRUE,
      selection = "multiple",
      groupBy = c("Manufacturer",
                  "Type")
      
    )
  })
  
  selected <- reactive(getReactableState("table", "selected"))  
  
  select_man <- eventReactive(input$filter_man,{
    which(data$Manufacturer%in% input$filter_man )
  })
  

  
  observeEvent(input$selections, {
    # Select rows
    updateReactable("table", selected = c(selected(), select_man()))
  })
  
}

shinyApp(ui, server)
于 2022-01-16T19:01:43.233 回答