2017-09-20 4 views
1

私は、ボタンがクリックされるたびにいくつかの入力フィールドを持つ新しいUI要素が作成される、Shinyで動的UIを作成したいと考えています。私はreactValueを使ってこれを行うことができると期待していましたが、uiコードはそれらにアクセスできないため、表示するエレメントの数を指定することはできません。Shiny UIのreactiveValuesにアクセスする代わりに?

ボタンの最初の2回のクリックに対して、UIフィールドが1つしか作成されない再現可能な例ですが、uiセクションのlapplyは固定値(この例では3)にコード化されているため、その後、新しいものは表示されなくなります。私は高い数値でui値を設定することができますが、私が望むのはそれが反応的であることです。 (フルバージョンでは、私は同様に、各フィールドを削除するには、同じように動作し、ボタン、これらの各内のネストされた要素を持っているしたいと思います。)

server <- function(input, output) { 

    rv <- reactiveValues(numFields = 1) 
    # 
    # start with one input box 
    # 
    output$textUI1 <- renderUI(textInput("textInput1", "Input #1")) 
    # 
    # each time the button is clicked, increase the reactive value 
    # 
    observeEvent(input$addField, rv$numFields <- rv$numFields + 1) 
    # 
    # render any additional UI input fields according to value of rv$numFields 
    # 
    observe({ 
    if(rv$numFields > 1) 
    { 
     lapply(2:rv$numFields, function(i) { 
     output[[paste0("textUI", i)]] <- renderUI({ 
      textInput(paste0("textInput", i), paste0("Input #", i)) 
     }) 
     }) 
    } 
    }) 
} 

ui <- fluidPage(sidebarLayout(
    sidebarPanel(
    actionButton("addField", "Add text input box") 
), 

    mainPanel(
    # UI output 
    lapply(1:3, function(i) { # instead of 3 I want something like rv$numFields here 
     uiOutput(paste0("textUI", i)) 
    }) 
) 
)) 

shinyApp(ui, server) 

答えて

2

を代わりにserverからui理由に変数を渡しますあなたのサーバーの中に全体の動的なuiを作成しないでください。

library (shiny) 

server <- function(input, output) { 

    rv <- reactiveValues(numFields = 1) 
    # 
    # start with one input box 
    # 
    output$textUI <- renderUI(textInput("textInput1", "Input #1")) 
    # 
    # each time the button is clicked, increase the reactive value and add a new text input 

    observeEvent(input$addField,{ 
    rv$numFields <- rv$numFields + 1 
     output$textUI <- renderUI({ 
     lapply(1:rv$numFields, function(i) {textInput(paste0("textInput", i), paste0("Input #", i)) 
     }) 
     }) 

    }) 
} 

ui <- fluidPage(sidebarLayout(
    sidebarPanel(
    actionButton("addField", "Add text input box") 
), 

    mainPanel(
     uiOutput("textUI") 
) 
)) 

shinyApp(ui, server) 
+1

新しいフィールドの追加の問題を確実に解決します。新しいフィールドを追加するたびに、既に入力されているテキスト入力が削除されないようにするにはどうすればよいですか? – user3757897

+0

[this](https://stackoverflow.com/questions/41233242/add-remove-input-fields-dynamically-by-a-button-in-shiny-and-keep-values/41460121#41460121)を参照できます。 )リンク – SBista

関連する問題