基于闪亮输入的 dplyr 中的条件过滤器
Condition Filter in dplyr based on Shiny input
我正在为在线市场创建报告工具。我想添加一个复选框 "Coupon",其中只有在 Coupon 字段中具有正值的观察才会 selected。
所以,在 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 只会 select 个 'Coupon' 值 > 0 的观测值。如果没有被选中,它会 select 个 select 个观测值 'Coupon' 值 > -1。但是,我现在意识到它不起作用,因为没有价值的优惠券被赋予了 NA - 因此,无论复选框的价值如何,我只得到优惠券价值 > 0 的观察结果。
所以,我的问题是,如何让 dplyr 仅在选中复选框时输出 Coupon 值不为 NA 的观察结果,而在未选中复选框时输出所有观察结果?
鉴于您指出实际存在多个变量,您需要过滤 NA
或不过滤,您可以通过 filter_
使用标准评估和包 [=39] 的一些帮助来完成此操作=]lazyeval.
library(dplyr)
library(lazyeval)
算法应该是这样的:
首先,对于您想要删除缺失值或保留它们的每个复选框,您将在 server.r
中做出反应性陈述,类似于您的问题,除了它会 return NULL
或您作为字符串使用的数据集中的变量名称。
Coupon_Select <- reactive({
if(input$checkbox){"Coupon"}
else {NULL}
})
Sale_Select <- reactive({
if(input$checkbox2){"Sale"}
else {NULL}
})
您将在 Data_Select
反应函数中使用这些反应函数的输出。在此步骤中,您将把复选框的反应结果连接到一个向量或列表中,然后使用 lapply
循环遍历它们,为每个变量设置在 filter_
中使用的条件。这涉及使用包 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)
})
我发现这在所有复选框反应函数 return 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)) }
第一个过滤器用于您要过滤的项目,而不考虑优惠券复选框。大括号内是一个 if 语句,如果复选框被标记,它将按照您指定的方式进行过滤,如果没有,如果我了解可能的结果,它将保留所有内容。
我使用这种类型的设置在闪亮的应用程序中创建交互式表格。
我正在为在线市场创建报告工具。我想添加一个复选框 "Coupon",其中只有在 Coupon 字段中具有正值的观察才会 selected。
所以,在 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 只会 select 个 'Coupon' 值 > 0 的观测值。如果没有被选中,它会 select 个 select 个观测值 'Coupon' 值 > -1。但是,我现在意识到它不起作用,因为没有价值的优惠券被赋予了 NA - 因此,无论复选框的价值如何,我只得到优惠券价值 > 0 的观察结果。
所以,我的问题是,如何让 dplyr 仅在选中复选框时输出 Coupon 值不为 NA 的观察结果,而在未选中复选框时输出所有观察结果?
鉴于您指出实际存在多个变量,您需要过滤 NA
或不过滤,您可以通过 filter_
使用标准评估和包 [=39] 的一些帮助来完成此操作=]lazyeval.
library(dplyr)
library(lazyeval)
算法应该是这样的:
首先,对于您想要删除缺失值或保留它们的每个复选框,您将在 server.r
中做出反应性陈述,类似于您的问题,除了它会 return NULL
或您作为字符串使用的数据集中的变量名称。
Coupon_Select <- reactive({
if(input$checkbox){"Coupon"}
else {NULL}
})
Sale_Select <- reactive({
if(input$checkbox2){"Sale"}
else {NULL}
})
您将在 Data_Select
反应函数中使用这些反应函数的输出。在此步骤中,您将把复选框的反应结果连接到一个向量或列表中,然后使用 lapply
循环遍历它们,为每个变量设置在 filter_
中使用的条件。这涉及使用包 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)
})
我发现这在所有复选框反应函数 return 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)) }
第一个过滤器用于您要过滤的项目,而不考虑优惠券复选框。大括号内是一个 if 语句,如果复选框被标记,它将按照您指定的方式进行过滤,如果没有,如果我了解可能的结果,它将保留所有内容。
我使用这种类型的设置在闪亮的应用程序中创建交互式表格。