如何在 Shiny 中更改动态 UI 中的输入数量
How to change the number of inputs in a dynamic UI in Shiny
我正在尝试在 Shiny 中开发一个应用程序,该应用程序接收名为 "number of stakeholders" 的初始输入,并且根据该数字,我希望它可以更改 [=] 中的标签数量12=] 和 navlistPanel()
结构。
我当前的代码复制类似序列的次数与我设置的固定利益相关者的最大数量一样多,给我留下了一个巨大的 10.000 行代码,这些代码不断重复命令:
tabPanel("Stakeholder #3",
fluidRow(
column(2, textInput(inputId = "sh.name.3", label = "Stakeholder's name")),
column(1),
column(4, textInput(inputId = "sh.3.option.1", label = "Option #1")),
column(1),
column(4, textInput(inputId = "sh.3.option.2", label = "Option #2"))
),
fluidRow(
column(3),
column(4, textInput(inputId = "sh.3.option.3", label = "Option #3")),
column(1),
column(4, textInput(inputId = "sh.3.option.4", label = "Option #4"))
),
我正在尝试找到一个选项,它允许我创建更紧凑的代码,同时为我提供了一种制作动态 UI 的方法,这意味着需要找到一个也能够动态管理变量的方法。
尽管 R 自然地允许以非常流畅的方式管理变量,但我在 Shiny 中使用列表、向量或数据框等结构还没有成功。
我检查了好几天,但没能找到比这更详细的东西(变量自身重置有问题):http://shiny.rstudio.com/gallery/dynamic-ui.html
是否有任何解决方案可以执行我正在寻找的东西?
在此先感谢您。
使用 lapply 创建一组动态面板相当容易。假设您给定的利益相关者数量是 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
属性中。
我正在尝试在 Shiny 中开发一个应用程序,该应用程序接收名为 "number of stakeholders" 的初始输入,并且根据该数字,我希望它可以更改 [=] 中的标签数量12=] 和 navlistPanel()
结构。
我当前的代码复制类似序列的次数与我设置的固定利益相关者的最大数量一样多,给我留下了一个巨大的 10.000 行代码,这些代码不断重复命令:
tabPanel("Stakeholder #3",
fluidRow(
column(2, textInput(inputId = "sh.name.3", label = "Stakeholder's name")),
column(1),
column(4, textInput(inputId = "sh.3.option.1", label = "Option #1")),
column(1),
column(4, textInput(inputId = "sh.3.option.2", label = "Option #2"))
),
fluidRow(
column(3),
column(4, textInput(inputId = "sh.3.option.3", label = "Option #3")),
column(1),
column(4, textInput(inputId = "sh.3.option.4", label = "Option #4"))
),
我正在尝试找到一个选项,它允许我创建更紧凑的代码,同时为我提供了一种制作动态 UI 的方法,这意味着需要找到一个也能够动态管理变量的方法。
尽管 R 自然地允许以非常流畅的方式管理变量,但我在 Shiny 中使用列表、向量或数据框等结构还没有成功。
我检查了好几天,但没能找到比这更详细的东西(变量自身重置有问题):http://shiny.rstudio.com/gallery/dynamic-ui.html
是否有任何解决方案可以执行我正在寻找的东西?
在此先感谢您。
使用 lapply 创建一组动态面板相当容易。假设您给定的利益相关者数量是 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
属性中。