首页 > 解决方案 > 在 r 中限制输入 selectizeInput 的组合闪亮

问题描述

我正在构建一个小应用程序来总结一些数据。我的结果表包含多个类别的值,这些类别的总和为给定总数。现在我希望用户能够输入不同的类别并获得这些类别的统计数据的总和,或者向他们显示所有类别的总数(因此选择所有类别与选择总数相同)。为了使应用程序看起来更干净,我想简单地使用一个selectizeInput. 但是,这意味着如果用户选择了类别total,他们将不能选择其他 3 个类别中的任何一个,并且如果选择了 3 个类别中的任何一个,则total应该取消选择。否则,如果用户选择所有输入,包括总和的总和为 2* Total(在我的示例中为 20 而不是 10)。

小例子(基于https://shiny.rstudio.com/articles/selectize.html

df <- data.frame(x = c("Total", "A", "B", "C"),
                 sum_res = c(10, 5, 3, 2))
library(shiny)

ui <- fluidPage(title = 'Selectize examples',
                sidebarLayout(
                  sidebarPanel(
                    selectizeInput(
                      'e2',
                      '2. Multi-select',
                      multiple = TRUE,
                      selected = "Total",
                      choices = df$x
                    )
                  ),
                  mainPanel(
                    helpText('Output of the examples in the left:'),
                    verbatimTextOutput('ex_out'),
                    verbatimTextOutput('sum')
                  )
                ))


server <- function(input, output) {
  output$ex_out <- renderPrint({
    str(list(input$e2))
  })
  
  output$sum <- renderPrint({
    df %>%
      filter(x %in% input$e2) %>%
      summarise(sum = sum(sum_res))
  })
}
shinyApp(ui, server)

这有点相关,但与Selectizeinput 输入互斥 R Shiny不完全相同。

理想情况下,此解决方案将在 .js 中的自定义 javascript 中selectizeInput(),但也可以在服务器端。

标签: javascriptrshinyshinydashboard

解决方案


一种方法是在选中时忽略其他选择Total。尝试这个

df <- data.frame(x = c("A", "B", "C"),
                 sum_res = c(5, 3, 2))
library(shiny)

ui <- fluidPage(title = 'Selectize examples',
                sidebarLayout(
                  sidebarPanel(
                    selectizeInput(
                      'e2',
                      '2. Multi-select',
                      multiple = TRUE,
                      selected = "Total",
                      choices = c("Total",unique(df$x))
                    )
                  ),
                  mainPanel(
                    helpText('Output of the examples in the left:'),
                    verbatimTextOutput('ex_out'),
                    verbatimTextOutput('sum')
                  )
                ))


server <- function(input, output) {
  output$ex_out <- renderPrint({
    str(list(input$e2))
  })
  
  output$sum <- renderPrint({
    if ("Total" %in% input$e2 | length(input$e2)==3) df1 <- df
    else  df1 <- df %>% filter(x %in% input$e2) 
    df1 %>% summarise(sum = sum(sum_res))
  })
}
shinyApp(ui, server)

推荐阅读