2017-06-27 12 views
0

出力に影響を与えるオプションを選択したいと思います。ここには2つのオプションがあります:選択するカー、シリンダー。選択したオプションに基づいて、選択する選択肢が異なります。Shiny:SelectizeInputの選択肢の条件付きアップデートに関する問題

library(shiny) 

mtcars$cars <- rownames(mtcars) 

ui <- fluidPage(
    title = 'Select experiment', 
    sidebarLayout(
    sidebarPanel(
     radioButtons("selectOpt", "Want to select:", 
        list("Car"='car', "Cylinders"='cyl'), 
        selected = 'car'), 

     conditionalPanel(
     condition = "input.selectOpt=='car'", 
     selectizeInput(
      inputId = "sel_car", 
      label = "Select a Car", 
      choices = mtcars$cars 
     )), 
     conditionalPanel(
     condition = "input.selectOpt=='cyl'", 
     selectizeInput(
      inputId = "sel_cyl", 
      label = "Select Cylinders", 
      choices = unique(mtcars$cyl) 
     ) 
     ) 
    ), 
    mainPanel(
     helpText('Output of the examples in the left:'), 
     verbatimTextOutput('ex_out') 
    ) 
) 
) 

server <- function(input, output) { 

    output$ex_out <- renderPrint({ 
     if(!is.null(input$sel_car)){ 
     cat(input$sel_car,input$sel_cyl,'\n') 
     mtcars[mtcars$cars == input$sel_car,] 
     }else if(!is.null(input$sel_cyl)){ 
     mtcars[mtcars$cyl == input$sel_cyl,] 
     } 
    }) 
} 

shinyApp(ui, server) 

はしかし、私はいつもこの二つのオプションが選択されたオプションを持っていることを観察しました。これは出力の最初の行に表示されます(ソースcat(input$sel_car,input$sel_cyl,'\n'))。

カーがシリンダオプションの最初の選択は、選択されてしまった、選択されています。 When **Car** is selected

シリンダーオプションを選択すると、車のオプションマツダRX4の最初の選択肢も選択しまいました。 When **Cylinders** option is selected

どのように私は両方のifelse ifセクションを評価することができるだろうというように、最初の選択肢FOデフォルトの選択を避けるために?

答えて

1

シングル選択select(ize)Input()は常に選択されたオプションを持っています。 ?selectInputから:

選択
ザ最初に選択された値(又は複数の値であれば複数= TRUE)。指定されていない場合、デフォルトは単一選択リストの最初の値になり、複数選択リストの値はデフォルトになりません。

私たちが '無効' の選択の並べ替えを挿入することができた後、あなたがしている機能を取得するには、次の

selectizeInput(
    inputId = "sel_car", 
    label = "Select a Car", 
    choices = c('No car' = 0, mtcars$cars) 
) 

をそしてif.. elseにそれをチェック:

if(input$sel_car != 0){ 
    cat(input$sel_car,input$sel_cyl,'\n') 
    mtcars[mtcars$cars == input$sel_car,] 
} 

完全なコード:

library(shiny) 

mtcars$cars <- rownames(mtcars) 

ui <- fluidPage(
    title = 'Select experiment', 
    sidebarLayout(
    sidebarPanel(
     radioButtons("selectOpt", "Want to select:", 
        list("Car"='car', "Cylinders"='cyl'), 
        selected = 'car'), 

     conditionalPanel(
     condition = "input.selectOpt=='car'", 
     selectizeInput(
      inputId = "sel_car", 
      label = "Select a Car", 
      choices = c('No car' = 0, mtcars$cars) 
     )), 
     conditionalPanel(
     condition = "input.selectOpt=='cyl'", 
     selectizeInput(
      inputId = "sel_cyl", 
      label = "Select Cylinders", 
      choices = c('No cylinder selected' = 0, unique(mtcars$cyl)), 
      selected = NA 
     ) 
    ) 
    ), 
    mainPanel(
     helpText('Output of the examples in the left:'), 
     verbatimTextOutput('ex_out') 
    ) 
) 
) 

server <- function(input, output) { 

    output$ex_out <- renderPrint({ 
    cat(input$sel_car) 
    if(input$sel_car != 0){ 
     cat(input$sel_car,input$sel_cyl,'\n') 
     mtcars[mtcars$cars == input$sel_car,] 
    }else if(input$sel_cyl != 0){ 
     mtcars[mtcars$cyl == input$sel_cyl,] 
    } 
    }) 
} 

shinyApp(ui, server) 
+0

解決に感謝します。私はアプリの奇妙な動作を観察している。 Carオプションで選択を選択した後でCylinderオプションで選択肢を選択した場合、表示される出力は期待通りにはなりません(選択されたシリンダ数を持つ行)。しかし、私はアプリをリフレッシュし、シリンダーオプションで直接選択を選択した場合、それは正常に動作します。この動作の回避策は何ですか? – Prradep

+0

その動作が期待されます。 'conditionalPanel'は入力を隠すだけですが、選択した値はまだそこにあります。 2つの排他的な 'Input'sが必要な場合は、おそらく' updateSelectInput() '関数を見たいでしょう。 – GGamba