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

时间:2015-08-21 19:41:02

标签: r shiny dplyr

我正在为在线市场创建一个报告工具。我想添加一个复选框“优惠券”,其中只选择在优惠券字段中具有正值的观察值。

所以,在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将仅选择其“优惠券”值&gt;的观察值。如果没有检查,它将选择“优惠券”值&gt;的观察值。 -1。但是,我现在意识到它不起作用,因为没有价值的优惠券被给予NA - 因此,无论复选框的值如何,我只会获得优惠券值的观察&gt; 0

所以,我的问题是,如何在选中复选框时,仅使用非优惠券的非优惠券值进行dplyr输出,以及未选中时的所有观察值?

2 个答案:

答案 0 :(得分:3)

鉴于您表示有实际的多个变量需要过滤NA,您可以使用filter_的标准评估和包 lazyeval <的一些帮助来完成此操作/ em>的

library(dplyr)
library(lazyeval)

算法将是这样的:

首先,对于您要删除缺失值或保留它们的每个复选框,您将在server.r中以类似于您的问题的方式生成一个被动声明,除非它返回{{ 1}}或您用作字符串的数据集中的变量名。

NULL

您将在Coupon_Select <- reactive({ if(input$checkbox){"Coupon"} else {NULL} }) Sale_Select <- reactive({ if(input$checkbox2){"Sale"} else {NULL} }) 无功功能中使用这些无功功能的输出。在此步骤中,您将复选框反应结果连接到一个向量或列表中,然后使用Data_Select循环它们以设置每个变量的条件,以便在lapply中使用。这涉及使用 lazyeval 包中的filter_,就像在this answer中一样。请注意,这对每个变量使用相同的条件(删除包含这些特定变量的缺失值的行)时会起作用。

要过滤的条件的输出列表可以在interp的{​​{1}}参数中使用。我添加了.dots作为第二个过滤步骤,因此您仍然可以通过filter_轻松完成其他条件。

filter_

我发现当所有复选框反应函数返回filter并且您不需要任何其他过滤时,这种方法非常有用。

答案 1 :(得分:0)

如果您要坚持使用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)) }

第一个过滤器用于要过滤的项目,而不考虑Coupon复选框。大括号内是一个if语句,如果选中该复选框,则该if语句将按照您指定的内容进行过滤,如果未选中,则将保留所有内容(如果我了解可能的结果)。

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