如何使用 quosure 在 dplyr 中将过滤语句作为函数参数传递
How to pass a filter statement as a function parameter in dplyr using quosure
使用 R
中的 dplyr
包,我想将过滤语句作为函数的参数传递。我不知道如何将语句评估为代码而不是字符串。当我尝试下面的代码时,我收到一条错误消息。我假设我需要一个 quosure 或其他东西,但我没有完全理解这个概念。
data("PlantGrowth")
myfunc <- function(df, filter_statement) {
df %>%
filter(!!filter_statement)
}
myfunc(PlantGrowth, "group %in% c('trt1', 'trt2')")
> Error: Argument 2 filter condition does not evaluate to a logical vector
# Want to do the same as this:
# PlantGrowth %>%
# filter(group %in% c('trt1', 'trt2'))
您可以使用 rlang
中的 parse_expr
library(dplyr)
myfunc <- function(df, filter_statement) {
df %>% filter(eval(rlang::parse_expr(filter_statement)))
}
identical(myfunc(PlantGrowth, "group %in% c('trt1', 'trt2')"),
PlantGrowth %>% filter(group %in% c('trt1', 'trt2')))
#[1] TRUE
同样可以使用 infamous eval
和 parse
来完成。
myfunc <- function(df, filter_statement) {
df %>% filter(eval(parse(text = filter_statement)))
}
使用 R
中的 dplyr
包,我想将过滤语句作为函数的参数传递。我不知道如何将语句评估为代码而不是字符串。当我尝试下面的代码时,我收到一条错误消息。我假设我需要一个 quosure 或其他东西,但我没有完全理解这个概念。
data("PlantGrowth")
myfunc <- function(df, filter_statement) {
df %>%
filter(!!filter_statement)
}
myfunc(PlantGrowth, "group %in% c('trt1', 'trt2')")
> Error: Argument 2 filter condition does not evaluate to a logical vector
# Want to do the same as this:
# PlantGrowth %>%
# filter(group %in% c('trt1', 'trt2'))
您可以使用 rlang
parse_expr
library(dplyr)
myfunc <- function(df, filter_statement) {
df %>% filter(eval(rlang::parse_expr(filter_statement)))
}
identical(myfunc(PlantGrowth, "group %in% c('trt1', 'trt2')"),
PlantGrowth %>% filter(group %in% c('trt1', 'trt2')))
#[1] TRUE
同样可以使用 infamous eval
和 parse
来完成。
myfunc <- function(df, filter_statement) {
df %>% filter(eval(parse(text = filter_statement)))
}