【问题标题】:Conditional filtering using dbplyr in Shiny在 Shiny 中使用 dbplyr 进行条件过滤
【发布时间】:2021-09-16 02:23:22
【问题描述】:

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

这是仅在从数据库中收集数据后才起作用的 sn-p,这在计算上是昂贵的。

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 语句。

【问题讨论】:

  • 不清楚您遇到的问题是什么。代码是否适用于前者(使用collect()),但不适用于后者?我想有两种可能的解释: 1. 不知何故,filter 与远程源的工作方式不同。 2. 代码中的某些内容需要本地数据(在这种情况下,在filter() 之后添加collect() 可能会使其工作)。
  • 我collect() 第一次工作的代码。但我不想在运行汇总函数之前收集。
  • 我理解不想collect()。但是,如果您颠倒filter() 和collect() 的顺序,代码是否有效? (如果collect() 的成本很高,则使用collect(n = 100) 或其他方法可能用于诊断目的。)如果它不起作用,则表明filter() 没有被转换为SQL以你想要的方式。

标签: r dplyr shiny dbplyr


【解决方案1】:

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

reactive({

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

})

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

【讨论】:

  • 我能够用我提供的答案解决这个问题。我需要查询来提供惰性数据框。
【解决方案2】:

这就是问题的解决方案。

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

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2018-02-21
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 2018-01-30
    • 2020-05-25
    相关资源
    最近更新 更多