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

yab*_*exu 2 r shiny

一个非常简单的问题:我要在输出中使用多个条形图,

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

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

但这是行不通的,似乎循环未完全执行,需要在这里提供帮助。

MrF*_*ick 5

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

最简单的解决方法可能是从for循环切换为using 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")
))
))
Run Code Online (Sandbox Code Playgroud)