在 Shiny 中使用 dbplyr 进行条件过滤

问题描述

我正在解决一个业务问题,我想根据用户提供的列表输入从闪亮的应用程序中的数据库中过滤数据。

以下是仅在从数据库中收集数据后才起作用的片段,这在计算上很昂贵。

reactive({
my_database_data %>%
collect() %>%
filter(
      if (!!input$list != 'All')
        (branch == !!input$list
        ) else TRUE)
})

我想直接从数据库中实现相同的目标。

reactive({
my_database_data %>%
filter(
      if (!!input$list != 'All')
        (branch == !!input$list
        ) else TRUE)
})

对上面的 if-else 语句不太确定。

解决方法

这是问题的解决方案。

reactive({
  # If 'All' not selected,filter
  if (input$list != 'All') {
    
    filter(my_database_data,branch == !!input$list)
    
  } else {
    
    my_database_data
    
  }
})
,

在不确定 input$list 包含什么的情况下,很难提供准确的解决方案。部分参考@AaronSimumba 的回答,部分参考@IanGow 的评论,我建议如下:

reactive({

if(input$list == 'All'){
  result = my_database_data %>%
    collect()
} else {
  result = my_database_data %>%
    filter(branch == !!input$list) %>%
    collect()

})

这意味着如果指定了过滤器,则将在将数据绘制到 R 之前应用过滤器。我不确定在应用程序中使用数据之前是否有任何替代方法可以将数据collect .这取决于您如何使用过滤后的数据。