如何通过长度基于数字输入的for循环在Shiny中创建UI?

时间:2018-10-17 03:54:29

标签: r shiny shiny-reactivity

作为此示例的扩展:

https://shiny.rstudio.com/gallery/creating-a-ui-from-a-loop.html

假设您希望for循环的长度由数字输入确定。因此,例如,扩展链接的示例(仅使用第二部分):

ui <- fluidPage(
  title = 'Creating a UI from a dynamic loop length',
  sidebarLayout(
    sidebarPanel(
      # Determine Length of Loop
      numericInput(inputId = "NumLoop", "Number of Loops", value = 5, min = 1, max = 5, step = 1)
    ),
    mainPanel(
      # UI output
      lapply(1:input.NumLoop, function(i) {
        uiOutput(paste0('b', i))
      })
    )
  )
)

server <- function(input, output, session) {
  reactive({
    lapply(1:input$NumLoop, function(i) {
      output[[paste0('b', i)]] <- renderUI({
        strong(paste0('Hi, this is output B#', i))
      })
    })
  })
}

shinyApp(ui = ui, server = server)

据我所知,代码有两个问题:

在UI中,我不知道如何在UI输出的for循环中合法使用NumLoop的输入。我已经尝试过conditionalPanel函数,但是运气不好。

在服务器中,一旦我将循环放在reactive函数后面以使用input$NumLoop,我将无法再访问UI中的renderUI输出。

任何解决这些问题的想法都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题,按照@Dean的说法,是的,第二个renderUI不应该存在

library(shiny)

ui <- fluidPage(
  title = 'Creating a UI from a dynamic loop length',
  sidebarLayout(
    sidebarPanel(
      # Determine Length of Loop
      numericInput(inputId = "NumLoop", "Number of Loops", value = 5, min = 1, max = 10, step = 1)
    ),
    mainPanel(
      # UI output
      uiOutput('moreControls')
    )
  )
)

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

  output$moreControls <- renderUI({
    lapply(1:input$NumLoop, function(i) {
      strong(paste0('Hi, this is output B#', i),br())
    })
  })

}

shinyApp(ui = ui, server = server)

enter image description here