R Shiny-使用insertUI动态添加从属输入

时间:2019-05-31 10:28:57

标签: r shiny

下面的应用程序包含一个actionButtonAdd,在单击时会插入两个输入。

第一个输入是带有选择AB的selectInput。如果用户选择textInput,则第二个输入是A;如果用户选择numericInput,则第二个输入是B。我不确定如何捕获此依赖关系。

我尝试将事件处理程序(下面的代码中的第二个observeEvent)附加到每个selectInput上,该事件处理程序监听该selectInput的值,并使用{{ 1}}。但是,这不起作用。我还对在observeEvent中使用渲染函数保持警惕,因为我已阅读到在观察者内部使用渲染不是一种好习惯(不确定原因)。它看起来也很凌乱。

应用程序:

renderUI

插入的第一个UI块按预期工作-渲染两个输入。但是,在随后的块(下面的屏幕快照中的块2和3)中,仅呈现selectInput。

这是屏幕截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

以下是有效代码。主要问题是您的ctn无功值已初始化为NULL,因为NULL + 1 = numeric(0)numeric(0) + 1 = numeric(0)

library(shiny)

ui <- fluidPage(
  actionButton('add', 'Add'),
  div(id = 'placeholder')
)

server <- function(input, output, session) {

  ctn <- reactiveVal(0)
  Id <- reactive({
    function(id){
      paste0(id, ctn())
    }
  })

  observeEvent(input$add, {

    ctn(ctn() + 1)

    insertUI(
      selector = '#placeholder',
      ui = div(
        id = Id()('div'),
        selectInput(Id()('letter'), 'Letter:', LETTERS[1:2]),
        uiOutput(Id()('input'))
      )
    )

  })

  observeEvent(ctn(), {
    id <- Id()('input')
    selection <- Id()('letter')
    output[[id]] <- renderUI({
      req(input[[Id()('letter')]])
      switch(
        input[[selection]],
        'A' = textInput(Id()('text'), 'ENTER TEXT', ''),
        'B' = numericInput(Id()('numeric'), 'ENTER NUMBER', '')
      )
    })
  }, ignoreInit = TRUE)

}