2016-03-02 15 views
1

很简单的问题:我想在输出几个barplots,如何在闪亮的应用程序中的循环内生成多图的输出?

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

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

但它不工作,似乎循环未完全执行,需要某人的帮助。

+0

请提供AA [再现的示例](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example),所以我们可以测试代码以查看可能发生的情况。还包括一个简单的用户界面来测试。 – MrFlick

回答

2

所以你似乎遇到的问题与延迟评估有关。 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") 
)) 
)) 
+0

谢谢MrFlick,它的工作原理! – yabchexu

相关问题