我正在为在线市场创建一个报告工具。我想添加一个复选框,"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 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)
})
我发现它特别有用,当所有复选框响应函数返回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语句,如果复选框被标记,它将按照您指定的过滤,如果没有,如果我理解可能的结果,它将保留所有内容。
我使用这种类型的设置来创建一个闪亮的应用程序中的交互式表。