【发布时间】:2018-02-19 14:59:28
【问题描述】:
我想在我的数据上使用dplyr 的新 NSE 表示法(版本 >= 0.6)作为动态 filter。假设我有以下虚拟数据集:
df = data_frame(x = 1:10, y = 10:1, z = 10 * runif(10))
如果现在我想过滤列 tofilter = "x" 中大于 5 的值,我知道我可以这样做:
df %>%
filter((!!rlang::sym(tofilter)) >= 5)
问题 1
如果我也想动态更改过滤运算符怎么办(假设我有一个 Shiny 应用程序,用户可以在其中动态selectInput if 过滤大于 5、等于 5 或小于的值的数据5?
我想做的是:
op = ">="
val = 5
filt_expr = paste("x", op, val)
df %>%
filter(filt_expr)
显然,这不起作用,我已经使用了 rlang quosore/symbols 等,但没有找到正确的方法来“引用”我的输入。
问题 2
额外的问题是,如果我想应用多个过滤器怎么办?我是否需要循环,或者我可以创建一个过滤表达式列表并一次性应用它们?
一个例子是一个闪亮的应用程序,用户可以输入他/她想要应用于数据的多个条件,以便我们有一个动态变化的格式列表:
filt_expr_list = list("x >= 5", "y <= 10", "z >= 2")
我们想动态地应用它们,这样输出就相当于:
df %>%
filter(x >= 5, y <= 10, z >= 2)
我想这在某种意义上是问题 1 的一个子集,因为当我知道如何正确引用论点时,我认为我可以这样做:
filt_expr = paste0(unlist(filt_expr_list), collapse = ", ")
df %>%
filter(filt_expr)
但是很高兴看看是否有更好的清洁方式
【问题讨论】:
标签: r dplyr tidyverse nse tidyeval