如何在闪亮的应用程序中为循环内的多图生成输出?

时间:2016-03-02 01:56:03

标签: r shiny

非常简单的问题:我想要输出几个条形图,

例如:我有一个数据集:数据和客户列表:cname

shinyServer(function(input, output){
     for(name in cname){
        output[[name]] <- renderPlot({
        bp<-barplot(data[data$customer==name,1])
        })
     }
}

但它不起作用,似乎循环没有完全执行,需要别人的帮助。

2 个答案:

答案 0 :(得分:4)

因此,您似乎遇到的问题与延迟评估有关。 renderPlot()中的命令不会立即执行。当绘图准备好绘制时,它们被捕获并运行。问题是name的值正在改变每次迭代。绘制绘图时(在for循环完成后很长时间),name变量只有循环中的最后一个值。

最简单的解决方法可能是从for循环切换到使用Map。由于Map调用函数,这些函数创建闭包,捕获每次迭代的name的当前值。试试这个

# sample data
set.seed(15)
cname <- letters[1:3]
data <- data.frame(
    vals = rpois(10*length(cname),15),
    customer = rep(cname,each=10)
)

runApp(list(server=
shinyServer(function(input, output){
     Map(function(name) {
           output[[name]] <- renderPlot({
           barplot(data[data$customer==name,1])
        })
        },
        cname)
})
,ui=
shinyUI(fluidPage(
    plotOutput("a"),
    plotOutput("b"),
    plotOutput("c")
))
))

答案 1 :(得分:0)

我同意接受的答案中的解释。但是,我们不需要使用Map的包装函数mapply,即sapply的多元版本(请参见?Map)。在这种情况下,我们可以简单地使用更传统的功能lapply

lapply(cname, function(name) {
    output[[name]] <- renderPlot({
      barplot(data[data$customer==name,1])
    })
  })