现在,rlang 0.4.0 为此类用例引入了一种更直观的新方法:
packageVersion("rlang")
# [1] ‘0.4.0’
df <- data.frame(V=c(6, 1, 5, 3, 2), Unhappy=c("N", "Y", "Y", "Y", "N"))
fld <- "Unhappy"
sval <- "Y"
df %>% filter(.data[[fld]]==sval)
#OR
filter_col_val <- function(df, fld, sval) {
df %>% filter({{fld}}==sval)
}
filter_col_val(df, Unhappy, "Y")
更多信息请访问https://www.tidyverse.org/articles/2019/06/rlang-0-4-0/
上一个答案
使用 dplyr 0.6.0 及更高版本,此代码有效:
packageVersion("dplyr")
# [1] ‘0.7.1’
df <- data.frame(V=c(6, 1, 5, 3, 2), Unhappy=c("N", "Y", "Y", "Y", "N"))
fld <- "Unhappy"
sval <- "Y"
df %>% filter(UQ(rlang::sym(fld))==sval)
#OR
df %>% filter((!!rlang::sym(fld))==sval)
#OR
fld <- quo(Unhappy)
sval <- "Y"
df %>% filter(UQ(fld)==sval)
更多关于dplyr 语法的信息,请参见http://dplyr.tidyverse.org/articles/programming.html 和rlang 包https://cran.r-project.org/web/packages/rlang/index.html 中的quosure 用法。
如果您发现在 dplyr 0.6+ 中掌握非标准评估具有挑战性,Alex Hayes 有一篇关于该主题的出色文章:https://www.alexpghayes.com/blog/gentle-tidy-eval-with-examples/
原答案
使用 dplyr 0.5.0 及更高版本,可以使用更简单的语法并更接近 @Ricky 最初想要的语法,我也发现它比使用 lazyeval::interp 更具可读性
df %>% filter_(.dots = paste0(fld, "=='", sval, "'"))
# V Unhappy
#1 1 Y
#2 5 Y
#3 3 Y
#OR
df %>% filter_(.dots = glue::glue("{fld}=='{sval}'"))