2017-02-04 15 views
0

selectizeInputには、A1、A2、B1、B2、C1、C2の6つのオプションがあります。R shiny - /またはオプションでSelectizeInputを入力してください

は今、私は次のコードを持っている:

ui <- fluidPage(
    selectizeInput("select", "Select multiple", multiple = T, 
       choices = c("A1", "A2", "B1", "B2", "C1", "C2")) 

をそしてそれは、この生成します

                                                                                select

あなたは最小限の再現可能な例をしたい場合は、ここではそれに光沢のあるアプリです。

library(shiny) 

ui <- fluidPage(
    selectizeInput("select", "Select multiple", multiple = T, 
       choices = c("A1", "A2", "B1", "B2", "C1", "C2")) 
) 

server <- function(input, output){} 
shinyApp(ui, server) 

私はしかし欲しい、1つだけの文字の各タイプのは選択可能になります。

A1、B1、C2は問題ありませんが、A1、A2は問題ありません。言い換えれば、A1とA2はグループ内にあり、B1とB2はグループ内にあり、各グループから1つだけが選択可能である。

この機能を使用するには2通りの方法があります。

  1. A1が選択されると、残りの選択肢からA2が消えます。ユーザーが残りの選択項目でA2(およびA1)を戻すには、A1を削除する必要があります。
  2. A1が選択されても、A2は残りの選択肢に残りますが、A2が選択されていればA1は選択されず、残りの選択肢

updateSelectizeInputでこれを行う方法はありますか?

答えて

2

ここでは一部のエキスパートが除外部分を好きになると思う=)光沢のある部分に関しては、あなたの要件を満たす必要があります。

library(shiny) 

ui <- fluidPage(
    uiOutput("select") 
) 

server <- function(input, output, session){ 
    global <- reactiveValues(choices = c("A1", "A2", "B1", "B2", "C1", "C2")) 
    output$select <- renderUI({ 
    selectizeInput("select", "Select multiple", multiple = T, choices = global$choices) 
    }) 

    observe({ 
    if(!is.null(input$select)){ 
     # exclude by comparing first Letters 
     firstLetterSelected <- as.character(sapply(input$select, substr, 1, 1)) 
     firstLetterAllChoices <- as.character(sapply(global$choices, substr, 1, 1)) 
     subset <- sort(c(input$select, global$choices[which(!(firstLetterAllChoices %in% firstLetterSelected))])) 
     updateSelectizeInput(session, "select", choices = subset, selected = input$select) 
    }else{ 
     # if inputs are erased completely this list is not refreshed without this else statement 
     updateSelectizeInput(session, "select", choices = global$choices, selected = input$select) 
    } 
    }) 
} 
shinyApp(ui, server) 
+0

です。レターオプション(A1、A2 ..)はデモ用で、実際のコードには別のオプション名が付いていましたが、他のオプションも使えるようにコードを修正しました。ありがとう! –

関連する問題