在Shiny应用程序中生成动态数量的图时,我已经生成了一系列我想要循环的图。在服务器函数中,我有一个具有以下结构的observe函数:
server = function(input, output, session) {
<Lots of other code>
plotlist = generate_list_of_plots()
for(i in seq_len(length(plot list))) {
plotname = sprintf('ui_plot_%i', i)
output[[plotname]] = renderPlot(plotlist[[i]])
}
<Lots of other code>
}
不幸的是,这并不像我想的那样起作用,因为对于在单独的代码块中生成的每个相关的plotOutput对象,重复列表中的最后一个图。我相信这种行为与以下事实有关:只有当用户点击选项卡并且i
索引变量已经前进到其最终位置并且每次都是静态时,才会显示绘图,直到调用renderPlot表达式这一事实执行renderPlot函数,因此得到相同的图。
1:这是问题的真正原因吗? 2:如果是,处理这种情况的正确方法是什么?
答案 0 :(得分:0)
好像我能够找到问题的解决方案。我的假设是正确的,答案是local
函数。该解决方案在this帖子中找到。
更正后的代码如下:
server = function(input, output, session) {
<Lots of other code>
plotlist = generate_list_of_plots()
for(i in seq_len(length(plot list))) {
local({
my_i = i
plotname = sprintf('ui_plot_%i', my_i)
output[[plotname]] = renderPlot(plotlist[[my_i]])
})
}
<Lots of other code>
}