【问题标题】:Alternative to accessing reactiveValues in Shiny UI?在 Shiny UI 中访问 reactiveValues 的替代方法?
【发布时间】:2018-03-01 23:10:52
【问题描述】:

我想在 Shiny 中创建一个动态 UI,每次单击按钮时,都会创建一个带有多个输入字段的新 UI 元素。我希望我可以使用 reactiveValues 来做到这一点,但是 ui 代码无法访问它们,所以我无法告诉它要显示多少元素。

这是一个可重现的示例,每次单击时只创建一个 UI 字段 - 它适用于按钮的前两次单击,但由于 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)

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    与其将变量从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) 
    

    【讨论】:

    • 这绝对解决了添加新字段的问题 - 我如何防止已经输入的文本输入在每次添加新字段时被删除?
    • 可以参考this链接
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多