簡體   English   中英

限制輸入 selectizeInput 在 r 閃亮的組合

[英]restrict combinations of input selectizeInput in r shiny

我正在構建一個小應用程序來匯總一些數據。 我的結果表具有總和為給定總數的多個類別的值。 現在我希望用戶能夠輸入不同的類別並獲得這些類別的統計數據的總和或向他們顯示所有類別的總數(因此選擇所有類別與僅選擇總數相同)。 為了使應用程序看起來更簡潔,我想簡單地使用一個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並不完全相同。

理想情況下,此解決方案將位於selectizeInput()中的自定義 javascript 中,但也可以位於服務器端。

一種方法是在選擇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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM