Shiny动态UI中的多个图

时间:2017-08-08 04:52:15

标签: r plot dynamic shiny

我正在尝试在闪亮的应用中动态插入一些情节。我把它简化为一个简单的例子,它显示了三个具有相同数量的箱子的直方图(48),即使它们应该是不同的(16,32,48)。可能我做过一些非常愚蠢的事情,或者错过了一些更微妙的东西!代码附后。提前感谢任何建议。

shinyUI(fluidPage(tagList(
          actionButton("button_id", "Show plot"),
          uiOutput("plot_id"),
          HTML("<div id=\"end\">The end</div>"))))

shinyServer(function(input, output) {

    # A list to hold the plot IDs
ls <- list()

observeEvent(input$button_id,
{
    x <- faithful[, 2]

    for (i in 1:3)
    {
            # generate bins based on input$bins from ui.R
        count <- i * 16
        bins <- seq(min(x), max(x), length.out = count)

        ls[[i]] <<- paste0("plot_", i)

        output[[ls[[i]]]] <- renderPlot(hist(x, breaks = bins, col = 'darkgray', border = 'white'))
    }
    output$plot_id <- renderUI({


        wellPanel(do.call(tagList, lapply(ls, function(x) 
        { 
            plotOutput(x) 
        })))

    })

})

})

1 个答案:

答案 0 :(得分:0)

这是导致问题的懒惰评估。直方图的代码不会立即执行,而是仅在要渲染绘图时执行。这是在for - 循环完成且i的值为3。

之后

为了强制进行即时评估,您可以将循环体包裹在local这样的环境中:

for (i in 1:3) {
    local({
    # generate bins based on input$bins from ui.R
    count <- i * 16
    bins <- seq(min(x), max(x), length.out = count)

    ls[[i]] <<- paste0("plot_", i)
    output[[ls[[i]]]] <- renderPlot(hist(x, breaks = bins, col = 'darkgray', border = 'white'))
    })
}