我正在尝试在Shiny中提出一个名为“利益相关者数量”的初始输入,根据该数字,我希望它能够更改{{1}中的标签数量}和navbarPage()
结构。
当前的代码我复制了一个类似的序列,就像我设置的固定利益相关者的最大数量一样,留下了一个巨大的10.000行代码,可以连续重复命令:
navlistPanel()
我正在尝试找到一个选项,允许我同时创建一个更紧凑的代码,这为我提供了一种制作动态UI的方法,这意味着需要找到一种方法来管理这些变量也是动态的。
尽管R自然允许以非常流畅的方式管理变量,但我还没有成功使用Shiny中的列表,向量或数据框等结构。
我查了好几天但是我找不到比这更复杂的东西(变量重置自身有问题):http://shiny.rstudio.com/gallery/dynamic-ui.html
是否有任何解决方案可以执行我正在寻找的内容?
先谢谢你。
答案 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
属性中。