2015-08-21 30 views
2

我正在为在线市场创建报告工具。我想添加一个复选框“优惠券”,其中只有在优惠券字段中具有正值的观察值被选中。条件根据Shiny输入在dplyr中筛选

所以,在ui.R我:

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

这是工作的罚款。

在server.RI有:

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只会选择观察其 '优惠券' 值> 0。如果它没有被检查,它会选择'Coupon'值> -1的观测值。不过,我现在意识到它不起作用,因为没有价值的优惠券被赋予NA - 因此,无论复选框的值如何,我只会获得优惠券值> 0的观察值。

所以,我的问题是,我怎样才能使dplyr输出只有在复选框被选中时不是NA的优惠券值的观测值以及没有被选中时的所有观测值?

+0

如何在被动的Data_Select中包含'if' /'else'?所以如果复选框被选中,你包括'!is。na(Coupon)'作为过滤器中的一个条件,否则你只用另外两个条件来完成过滤器。 – aosmith

+0

你的意思是有两个不同的Orders%>%filter()语句吗?如果是这样,我想再添加3个或4个其他类似条件的复选框,因此很快就会变得难以管理。 – SFuj

回答

3

既然你表明,你需要或者过滤器NA或没有,你可以通过filter_做到这一点使用标准评估实际的多个变量,并从包lazyeval一些帮助。

library(dplyr) 
library(lazyeval) 

算法将是这样的:

首先,对于每一个你想要么删除丢失的值或者让他们的复选框,你会作出反应声明server.r样的就像在你的问题中一样,除了它会返回NULL或者你使用的数据集的变量名作为字符串。

您将在您的Data_Select反应函数中使用这些反应函数的输出。在这一步中,您将连接复选框反应结果到一个向量或列表中,然后使用lapply循环遍历它们,以设置在filter_中使用的每个变量的条件。这包括使用来自lazyevalinterp,与this answer中一样。请注意,对每个变量使用相同的条件(删除包含这些特定变量的缺失值的行)时,这将起作用。

要过滤的条件的输出列表可用于参数filter_。我添加了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,你不需要任何额外的滤波。

+1

哇。我有点困惑/被那里的lapply功能所淹没,但我会坐下来试着弄明白。同时,非常感谢! – SFuj