我正在为在线市场创建一个报告工具。我想添加一个复选框“优惠券”,其中只选择在优惠券字段中具有正值的观察值。
所以,在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输出,以及未选中时的所有观察值?
答案 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语句将按照您指定的内容进行过滤,如果未选中,则将保留所有内容(如果我了解可能的结果)。
我使用这种类型的设置在闪亮的应用程序中创建交互式表格。