如何在Shiny中更改动态UI中的输入数量

时间:2016-02-07 17:39:46

标签: r dynamic shiny-server shiny

我正在尝试在Shiny中提出一个名为“利益相关者数量”的初始输入,根据该数字,我希望它能够更改{{1}中的标签数量}和navbarPage()结构。

当前的代码我复制了一个类似的序列,就像我设置的固定利益相关者的最大数量一样,留下了一个巨大的10.000行代码,可以连续重复命令:

navlistPanel()

我正在尝试找到一个选项,允许我同时创建一个更紧凑的代码,这为我提供了一种制作动态UI的方法,这意味着需要找到一种方法来管理这些变量也是动态的。

尽管R自然允许以非常流畅的方式管理变量,但我还没有成功使用Shiny中的列表,向量或数据框等结构。

我查了好几天但是我找不到比这更复杂的东西(变量重置自身有问题):http://shiny.rstudio.com/gallery/dynamic-ui.html

是否有任何解决方案可以执行我正在寻找的内容?

先谢谢你。

1 个答案:

答案 0 :(得分:3)

使用lapply创建一组动态的Panel非常简单。假设您的利益相关者数量为n,您的代码将为:

n = 10

app <- shinyApp(
  ui = shinyUI(fluidPage(

    uiOutput("tabsets")

  )), 

  server = function(input, output, session){

    output$tabsets <- renderUI({

      Panels <- lapply(1:n, function(number){
        tabPanel(paste0("Stakeholder #", number),
            fluidRow(
             column(2, textInput(inputId = paste0("sh.name.", number), label = "Stakeholder's name")),
             column(4, offset = 1, textInput(inputId = paste0("sh.", number, ".option.1"), label = "Option #1")),
             column(4, offset = 1, textInput(inputId = paste0("sh.", number, ".option.2"), label = "Option #2"))
            ),
            fluidRow(
             column(4, offset = 3, textInput(inputId = paste0("sh.", number, ".option.3"), label = "Option #3")),
             column(4, offset = 1, textInput(inputId = paste0("sh.", number, ".option.4"), label = "Option #4"))
            )
         )
      })

      do.call(tabsetPanel,Panels)
    })
  }
)

runApp(app)

我还将您的空列更改为包含在非空列的offset属性中。