基于闪亮输入的 dplyr 中的条件过滤器

Condition Filter in dplyr based on Shiny input

我正在为在线市场创建报告工具。我想添加一个复选框 "Coupon",其中只有在 Coupon 字段中具有正值的观察才会 selected。

所以,在 ui.R 我有:

checkboxInput("checkbox", label = "Coupon", value = TRUE)

这工作正常。

在 server.R 我有:

  Coupon_Select <- reactive({ 
    if(input$checkbox == TRUE){0}
      else {-1}  
  })

Data_Select <- reactive({
    Orders %>%
      filter(Region %in% Region_Select(), Community.Type %in% Type_Select(), 
             Coupon > Coupon_Select()
      )
    })

这里的想法是,如果复选框被选中,dplyr 只会 select 个 'Coupon' 值 > 0 的观测值。如果没有被选中,它会 select 个 select 个观测值 'Coupon' 值 > -1。但是,我现在意识到它不起作用,因为没有价值的优惠券被赋予了 NA - 因此,无论复选框的价值如何,我只得到优惠券价值 > 0 的观察结果。

所以,我的问题是,如何让 dplyr 仅在选中复选框时输出 Coupon 值不为 NA 的观察结果,而在未选中复选框时输出所有观察结果?

鉴于您指出实际存在多个变量,您需要过滤 NA 或不过滤,您可以通过 filter_ 使用标准评估和包 [=39] 的一些帮助来完成此操作=]lazyeval.

library(dplyr)
library(lazyeval)

算法应该是这样的:

首先,对于您想要删除缺失值或保留它们的每个复选框,您将在 server.r 中做出反应性陈述,类似于您的问题,除了它会 return NULL 或您作为字符串使用的数据集中的变量名称。

Coupon_Select <- reactive({ 
    if(input$checkbox){"Coupon"}
      else {NULL}  
  })

Sale_Select <- reactive({ 
    if(input$checkbox2){"Sale"}
      else {NULL}  
  })

您将在 Data_Select 反应函数中使用这些反应函数的输出。在此步骤中,您将把复选框的反应结果连接到一个向量或列表中,然后使用 lapply 循环遍历它们,为每个变量设置在 filter_ 中使用的条件。这涉及使用包 lazyeval 中的 interp,就像在 中一样。请注意,这在对每个变量使用相同条件时有效(删除包含这些特定变量缺失值的行)。

过滤条件的输出列表可以在 filter_.dots 参数中使用。我添加了 filter_ 作为第二个过滤步骤,因此您始终拥有的其他条件仍然可以通过 filter.

轻松完成
dataInput = reactive({
        extrafilt = c(Coupon_Select(), Sale_Select())
        dots = lapply(extrafilt, function(cols) interp(~!is.na(x), 
                                                        .values = list(x = as.name(cols))))
        Orders %>%
            filter(Region %in% Region_Select(), Community.Type %in% Type_Select())  %>%
            filter_(.dots = dots)
    })

我发现这在所有复选框反应函数 return NULL 并且您不需要任何额外过滤时特别有用。

如果您想坚持使用 dplyr,您可以在您的订单过滤语句中包含一个 if else 语句,如下所示:

Orders %>% 
filter(Region %in% Region_Select(), Community.Type %in% Type_Select() %>% 
{ if (input$coupon == TRUE) filter(., Coupon > 1) else filter(., Coupon > -1 | is.na(Coupon)) }

第一个过滤器用于您要过滤的项目,而不考虑优惠券复选框。大括号内是一个 if 语句,如果复选框被标记,它将按照您指定的方式进行过滤,如果没有,如果我了解可能的结果,它将保留所有内容。

我使用这种类型的设置在闪亮的应用程序中创建交互式表格。