在闪亮的反应渲染函数中循环列表的方法

时间:2016-03-30 00:58:14

标签: r shiny

在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:如果是,处理这种情况的正确方法是什么?

1 个答案:

答案 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>

}