基于Shiny输入的dplyr r条件滤波器



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

在ui中。R我有:

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

运行正常

在服务器。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()
      )
    })

这里的想法是,如果Checkbox被选中,dplyr将只选择'Coupon'值> 0的观测值。如果未选中,它将选择'Coupon'值> -1的观测值。然而,我现在意识到它不起作用,因为没有值的优惠券被给予NA -因此,无论复选框的值如何,我只得到优惠券值> 0的观察值。

所以,我的问题是,我怎么能使dplyr输出只有观察与优惠券值不是NA当复选框被选中时,和所有的观察当它没有被选中?

如果您指出需要过滤NA或不需要过滤多个变量,则可以使用filter_的标准求值和package lazyeval的一些帮助来完成此操作。

library(dplyr)
library(lazyeval)

算法应该是这样的:

首先,对于您想要删除缺失值或保留它们的每个复选框,您将在server.r中做出反应性声明,就像您的问题一样,除非它将返回NULL或您正在使用的数据集中的变量名称作为字符串。

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

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

筛选条件的输出列表可用于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)
    })

我发现它特别有用,当所有复选框响应函数返回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)) }

第一个过滤器用于您想要过滤的项目,而不管是否有Coupon复选框。在花括号内是一个if语句,如果复选框被标记,它将按照您指定的过滤,如果没有,如果我理解可能的结果,它将保留所有内容。

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

最新更新