【问题标题】:restrict combinations of input selectizeInput in r shiny在 r 中限制输入 selectizeInput 的组合闪亮
【发布时间】:2021-09-07 22:07:28
【问题描述】:

我正在构建一个小应用程序来汇总一些数据。我的结果表包含多个类别的值,这些类别的总和为给定总数。现在我希望用户能够输入不同的类别并获得这些类别的统计数据的总和或向他们显示所有类别的总数(因此选择所有类别与选择总数相同)。为了让应用看起来更干净,我想简单地使用一个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 inputs be mutually exclusive R Shiny不完全相同。

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

【问题讨论】:

    标签: javascript r shiny shinydashboard


    【解决方案1】:

    一种方法是在选择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)
    

    【讨论】:

    • 谢谢,服务器端做了正确的事情,但从 UI 的角度来看,这不是很直观。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2020-05-03
    • 2019-01-24
    相关资源
    最近更新 更多