R 如何在Shining app中为循环内的多个绘图生成输出?
非常简单的问题:我想要输出几个条形图 例如:我有一个dataset:data和一个customer:cname列表R 如何在Shining app中为循环内的多个绘图生成输出?,r,shiny,R,Shiny,非常简单的问题:我想要输出几个条形图 例如:我有一个dataset:data和一个customer:cname列表 shinyServer(function(input, output){ for(name in cname){ output[[name]] <- renderPlot({ bp<-barplot(data[data$customer==name,1]) }) } } shinyServer(功能(
shinyServer(function(input, output){
for(name in cname){
output[[name]] <- renderPlot({
bp<-barplot(data[data$customer==name,1])
})
}
}
shinyServer(功能(输入、输出){
for(cname中的名称){
输出[[name]]因此,您似乎遇到的问题与计算延迟有关。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")
))
))
#示例数据
种子(15)
cname我同意接受答案中的解释。但是我们不需要使用Map
函数,它是mapply
的包装,即sapply
(参见?Map)的多变量版本。在这种情况下,我们可以简单地使用更传统的函数lappy
:
lappy(cname,function(name){
输出[[name]]请提供一个带有一些示例数据的a,以便我们可以测试代码以查看可能发生的情况。还包括一个简单的UI,以进行测试。