我正在为一个在线市场创建一个报告工具。我想添加一个复选框,“优惠券”,其中只选择了在优惠券字段中具有正值的观察。
所以,在ui.R我有:
checkboxInput("checkbox", label = "Coupon", value = TRUE)这很好用。
我有:
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的观察。如果没有检查,它将选择其“优惠券”值> -1的观测值。但是,我现在意识到它不起作用了,因为没有值的优惠券被赋予了NA -因此,不管复选框的值是多少,我只会得到优惠券值> 0的观察结果。
因此,我的问题是,当选中复选框时,我如何使dplyr只输出不为NA的优惠券值的观察,以及在未选中时进行所有观察?
发布于 2015-08-21 21:09:34
考虑到您表示需要为NA筛选或不筛选实际的多个变量,您可以通过filter_使用标准评估和来自包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_中使用的条件。这涉及从包lazyeval中使用interp,就像在this answer中一样。注意,当对每个变量使用相同的条件(删除包含这些特定变量缺少值的行)时,这是可行的。
要筛选的条件的输出列表可用于filter_的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并且不需要任何额外的筛选时,我发现这是特别有用的。
发布于 2018-10-22 16:39:16
如果您想坚持使用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语句,它将按照您指定的那样过滤,如果复选框被标记,如果没有,它将保留一切,如果我理解可能的结果。
我使用这种类型的设置来创建一个闪亮的应用程序中的交互式表。
https://stackoverflow.com/questions/32148144
复制相似问题