【发布时间】:2020-03-31 04:34:02
【问题描述】:
R 和 tidyverse 有一些非常强大但同样神秘的方法可以将字符串转换为可操作的表达式。我觉得需要成为专家才能真正了解如何使用它们。
注意:这个问题与this one 的不同之处在于我专门询问了一个向量(即多个)过滤条件。我演示了单个过滤器的解决方案,当我尝试多种方法将其扩展到多个过滤器时失败。
我想做一些类似的事情:
df = data.frame(A=1:10, B=1:10)
df %>% filter(A<3, B<5)
但过滤器包含在字符串(例如 "A<3, B<5")或字符向量(例如 c("A<3", "B<5"))中。
我可以的
df %>% filter(eval(str2expression("A<3")))
# A B
# 1 1 1
# 2 2 2
但这不起作用:
df %>% filter(eval(str2expression("A<3, B<5")))
Error in str2expression("A<3, B<5") : <text>:1:4: unexpected ','
1: A<3,
^
这些也不起作用:
> df %>% filter(!!c(str2expression("A<3"), str2expression("B<5")))
Error: Argument 2 filter condition does not evaluate to a logical vector
> df %>% filter(!!!c(str2expression("A<3"), str2expression("B<5")))
Error: Can't splice an object of type `expression` because it is not a vector
Run `rlang::last_error()` to see where the error occurred.
由于某种原因,从str2expression 计算表达式向量只应用最后一个表达式:
> df %>% filter(eval(c(str2expression("A<3"), str2expression("B<5"))))
# A B
# 1 1 1
# 2 2 2
# 3 3 3
# 4 4 4
使用评估表达式的向量完全失败:
> df %>% filter(!!!c(eval(str2expression("A<3")), eval(str2expression("B<5"))))
Error in eval(str2expression("A<3")) : object 'A' not found
我能做到:
> df %>% filter(!!!c(expr(A<3), expr(B<5)))
# A B
# 1 1 1
# 2 2 2
这告诉我expr(A<3) 与str2expression("A<3") 不一样
但这不是从字符串开始的。
怎么办?
【问题讨论】:
-
我已将我的问题标记为重新打开,因为我的问题特别询问条件向量。 “类似”的问题没有。答案是不同的。此外,我的答案更简单。
-
在我链接的帖子中,有
parse_exprsselect_expr <- rlang::parse_exprs( select_str )与本文中的其他答案相同