非常简单的问题:我想要输出几个条形图,
例如:我有一个数据集:数据和客户列表:cname
shinyServer(function(input, output){
for(name in cname){
output[[name]] <- renderPlot({
bp<-barplot(data[data$customer==name,1])
})
}
}
但它不起作用,似乎循环没有完全执行,需要别人的帮助。
答案 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])
})
})