作为此示例的扩展:
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
输出。
任何解决这些问题的想法都会受到赞赏。
答案 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)