如果我想根据mpg〉10、气缸数等于4、马力大于100的条件过滤mtcars Dataframe ,我可以使用以下代码:
mtcars %>%
filter(mpg>10 & cyl ==4 & hp > 100)
# mpg cyl disp hp drat wt qsec vs am gear carb
# Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
# Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.6 1 1 4 2
好的!!但是如果我尝试创建一个条件作为对象,我会得到一个错误:
my_string_filter_condition <- c("mpg>10 & cyl ==4 & hp > 100")
mtcars %>%
filter(my_string_filter_condition)
# Error in `filter()`:
# ! Problem while computing `..1 = my_string_filter_condition`.
# x Input `..1` must be a logical vector, not a character.
# Run `rlang::last_error()` to see where the error occurred.
# or
mtcars %>%
filter(rlang::parse_expr(my_string_filter_condition))
# Error in `filter()`:
# ! Problem while computing `..1 = rlang::parse_expr(my_string_filter_condition)`.
# Caused by error in `vec_size()`:
# ! `x` must be a vector, not a call.
# Run `rlang::last_error()` to see where the error occurred.
请帮个忙好吗?
2条答案
按热度按时间yiytaume1#
parse_expr()
返回一个表达式,您需要对它进行eval
评估:bejyjqdl2#
注意,表达式和字符串在R中是两个非常不同的东西。你不能把一个字符串放在任何地方,然后期望R自动解析和计算它。如果你有一个表达式,那么最好把它存储在一个表达式类型的对象中,而不是一个字符串。例如,你可以用
rlang::expr
创建一个表达式,然后用!!
把这个表达式注入到dplyr函数中(!!
注入只适用于使用rlang
进行函数调用操作的函数--它不是一个基本的R特性,但在大多数tidyverse包中是常见的)