一个非常简单的问题:我要在输出中使用多个条形图,
例如:我有一个数据集:数据和一个客户列表: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)
但这是行不通的,似乎循环未完全执行,需要在这里提供帮助。
因此,您似乎遇到的问题与评估延迟有关。输入的命令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)