优化闪亮仪表板图重绘

时间:2018-11-15 02:08:26

标签: r shiny

我构建了一个闪亮的仪表板,该仪表板中加载了一组数据作为数据框。它使用dplyr选择列,然后根据需要更改新列,应用一组过滤器,然后使用各种基于ggplot2的高级软件包进行绘制。

我们尝试进行数据加载,仅选择和更改一次。过滤位于一个反应变量中,该变量可通过该图访问,并且基于不同的输入值。

据我所见,这是一个非常标准的典型用例。

我想知道是否有人可以建议工作流程模式以使输出响应更快。

在这种书写模式下,我遇到了两种情况,这些情况似乎会导致严重的用户界面延迟,我想避免这种情况:

  • 首先,当仪表板首次加载时,它将尝试使用NULL数据绘制图表。我发现我可以通过使用if(is.null(my_data_frame))并返回geom_blank()而不是我们的情节来解决这个问题。有没有更整洁/更快捷的方法?

  • 第二(也是更具挑战性):在我的绘图右侧是一组(可能很大)过滤器选项,以允许用户分析子集。如果用户快速连续单击这些选项中的几个选项,Shiny将重复重新计算我们的react()值并为每个单击事件重新绘制图表:用户实际上只需要设置或清除5个选项。有没有办法防止这种情况发生-因此,如果重新计算未完成,我们就不会继续进行绘图,因为我们已经使数据陈旧了?还是考虑使用更新按钮将选项分组以防止这种情况发生?

2 个答案:

答案 0 :(得分:0)

针对您的第二个项目符号。查看闪亮的debounce/throttle功能。这些应减慢反应性响应,以便您的用户可以在重新计算图表或表示元素之前完成UI控件。

答案 1 :(得分:0)

对于第一个问题,请尝试在反应式块中使用req函数。如果您的绘图正在等待数据框加载,则可以将用于加载数据框的代码放在一个命名的反应块中(似乎您已经这样做了),然后将其传递给req。这将防止绘图尝试渲染,直到它收到传递给req的任何内容的有效值为止。

对于第二个建议,如果通常希望用户在所需的图更新之间更改多个选项,则建议将图渲染包装在observeEvent中并具有“更新”按钮。

最后,为了提高性能,今天我才看到Shiny v1.2.0刚刚发布或即将发布,其主要功能是绘图缓存。您可以找到更多详细信息HERE