如何从长度基于数字输入的 for 循环在 Shiny 中创建一个 UI?
How to create a UI in Shiny from a for loop whose length is based on numeric input?
作为此示例的扩展:
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
我就无法再访问 [=32= 中的那些 renderUI
输出].
任何关于如何解决这些问题的想法都将不胜感激。
按照@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)
作为此示例的扩展:
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
我就无法再访问 [=32= 中的那些 renderUI
输出].
任何关于如何解决这些问题的想法都将不胜感激。
按照@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)