我正在尝试在闪亮的应用中动态插入一些情节。我把它简化为一个简单的例子,它显示了三个具有相同数量的箱子的直方图(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)
})))
})
})
})
答案 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'))
})
}