在 Shiny 中显示动态 UI 元素
Display dynamic UI elements in Shiny
我正在尝试在 Shiny 中生成动态图。地块的数量是事先不知道的,所以我使用 renderUI。问题是元素一个一个地显示在另一个之上。有没有办法指定要按行显示的元素数,然后一旦该行被填充,代码就会传递到下一行?
这是我的简单可重现示例:
library(shiny)
max_plots <- 50
server <- function(input, output) {
output$plots <- renderUI({
plot_and_radio_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
list(
plotOutput(plotname, height = 280, width = 250)
)
})
do.call(tagList, unlist(plot_and_radio_output_list, recursive = FALSE))
})
for (i in 1:max_plots) {
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots),
ylim = c(1, max_plots),
main = paste("1:", my_i, ". n is ", input$n, sep = "")
)
})
})
}
}
ui <- pageWithSidebar(
headerPanel("Dynamic number of plots"),
sidebarPanel(
sliderInput("n", "Number of plots", value=1, min=1, max=5)
),
mainPanel(
uiOutput("plots")
)
)
shinyApp(ui, server)
您可以将您的地块放在 div 中,并给它们 CSS 属性“inline-block”
output$plots <- renderUI({
plot_and_radio_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
list(
div(
plotOutput(plotname, height = 280, width = 250),
style = "display:inline-block;"
)
)
})
do.call(tagList, unlist(plot_and_radio_output_list, recursive = FALSE))
})
我正在尝试在 Shiny 中生成动态图。地块的数量是事先不知道的,所以我使用 renderUI。问题是元素一个一个地显示在另一个之上。有没有办法指定要按行显示的元素数,然后一旦该行被填充,代码就会传递到下一行? 这是我的简单可重现示例:
library(shiny)
max_plots <- 50
server <- function(input, output) {
output$plots <- renderUI({
plot_and_radio_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
list(
plotOutput(plotname, height = 280, width = 250)
)
})
do.call(tagList, unlist(plot_and_radio_output_list, recursive = FALSE))
})
for (i in 1:max_plots) {
local({
my_i <- i
plotname <- paste("plot", my_i, sep="")
output[[plotname]] <- renderPlot({
plot(1:my_i, 1:my_i,
xlim = c(1, max_plots),
ylim = c(1, max_plots),
main = paste("1:", my_i, ". n is ", input$n, sep = "")
)
})
})
}
}
ui <- pageWithSidebar(
headerPanel("Dynamic number of plots"),
sidebarPanel(
sliderInput("n", "Number of plots", value=1, min=1, max=5)
),
mainPanel(
uiOutput("plots")
)
)
shinyApp(ui, server)
您可以将您的地块放在 div 中,并给它们 CSS 属性“inline-block”
output$plots <- renderUI({
plot_and_radio_output_list <- lapply(1:input$n, function(i) {
plotname <- paste("plot", i, sep="")
list(
div(
plotOutput(plotname, height = 280, width = 250),
style = "display:inline-block;"
)
)
})
do.call(tagList, unlist(plot_and_radio_output_list, recursive = FALSE))
})