2017-06-25 1 views
0

一連のドロップダウンメニューを生成するための基礎として重いネストリスト(6つのレイヤー)を使用しようとしています。しかし、selectInput関数を通してネストされたリストを渡すとき、最も深い層は選択が行われるものです。以下は、私が直面している問題を再現するための簡単なアプリです。Shiny:リストのリストからselectInputを生成すると、最も深いレイヤーに直接移動します

library(shiny) 

    problemList <- list(
     deeperList = list (
     element1 = 1, 
     element2 = 2 
    ), 
     deeperList2 = list (
     element3 = 3, 
     element4 = 4 
    ) 
    ) 

    ui <- fluidPage(
     selectInput(inputId = "dropDownMenu", label = "Drop Down Menu", choices = problemList) 
    ) 

    server <- function(input, output) {} 

    shinyApp(ui = ui, server = server) 

Image showing what is generated by the code above

私は、ユーザーがメニュー最初のドロップダウンでdeeperListとdeeperList2の間で選択しようとしています。彼らがより深いリストを選択すると、別のドロップダウンメニューが生成され、ユーザーは要素1と要素2の間で選択することができますが、より深いリスト2を選択すると、ユーザーは要素3と要素4の間で選択できる別のドロップダウンメニューが生成されます。

答えて

0

基本的に2つの方法があります。

  1. renderUIで2番目のドロップダウンリストを作成します。そうすることで、最初のドロップダウンメニューの選択に応じて、2番目のドロップダウンメニューを選択することができます。 hereからの「renderUIでのコントロールの作成」を参照してください。
  2. 最初のものは、ここ

を変更するたびに使用updateSelectInput第二dropdownmenuを更新するためには、第二のオプション

library(shiny) 

problemList <- list(
    deeperList = list(
    element1 = 1, element2 = 2), 
    deeperList2 = list(
    element3 = 3, element4 = 4) 
) 

ui = inputPanel(
    selectInput("category", "choose a category", names(problemList)), 
    selectInput("choice", "select a choice", problemList[[1]]) 
) 

server = function(input, output, session){ 
    observe({ 
    updateSelectInput(session, "choice", choices = problemList[[input$category]]) 
    }) 
} 

shinyApp(ui, server) 

enter image description here

のオプション2は、ほとんどの場合に良好でなければならない例であり、入力に基づいてUIを再レンダリングすると、いくつかの厄介なバグやパフォーマンスが低下する可能性があります。

+0

ありがとうございます!完璧に動作します。 –

関連する問題