首页 文章

优化Shiny Dashboard图重绘

提问于
浏览
0

我已经构建了一个闪亮的仪表板,其中有一组数据作为数据框加载 . 它使用dplyr然后选择列,根据需要改变新列,应用一组过滤器,然后使用各种基于ggplot2的高级包进行绘图 .

我们尝试做一次数据加载,选择和变异 . 过滤位于反应变量中,由绘图访问,并基于不同的输入值 .

据我所知,这是一个非常标准和典型的用例 .

我想知道是否有人可以就工作流模式提出建议,以使输出更具响应性 .

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

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

  • 其次(更具挑战性):我的绘图右边是一组(可能很大)的过滤器选项,允许用户分析子集 . 如果用户快速连续点击其中几个选项,Shiny将重复重新计算我们的reactive()值并为每个点击事件重新绘制图表:用户实际上只需要设置或清除5个选项 . 有没有办法防止这种情况发生 - 所以如果重新计算没有完成,我们不会继续正在进行的情节,因为我们刚刚使数据失效?或者您是否考虑使用更新按钮对选项进行分组以防止这种情况发生?

2 回答

  • 0

    回应你的第二颗子弹 . 查看闪亮的debounce/throttle功能 . 这些应该减慢响应响应,以便用户可以在图表或表示元素重新计算之前完成UI控件 .

  • 0

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

    对于第二个,如果您通常希望用户在所需的绘图更新之间更改多个选项,我建议将绘图渲染包装在 observeEvent 并具有'Update'按钮 .

    最后,为了增加性能,我今天才看到Shiny v1.2.0刚刚发布或即将发布,其主要功能是绘图缓存 . 你可以找到更多细节HERE .

相关问题