如何在 dplyr 中获取 case_when 接受来自字符的条件

How to get case_when in dplyr accept conditions from character

我正在尝试在 shiny 应用程序中使用 case_when 以构建一个应用程序,显示以一组规则表示的某些选择策略的预览。

在应用程序中,用户可以输入 case_when 语法的表达式,例如:

cond = "Age > 40 ~ 1, TRUE ~ 0"

它们应该被替换为 case_when

我正在查看 rlang 并试图找出如何从字符向量中获取表达式,例如

tibble::tribble(~Age,23,26,32,50,51,52,25,49,34,54) %>% 
  mutate(result = case_when(!!!quos(syms(cond))))

但是,显然,没能做到正确

这个有效:

library(dplyr)
library(rlang)

repdata %>% 
  mutate(result = !!parse_expr(paste0("case_when(", cond, ")"))) %>% 
  head()
#    Age result
#  <dbl>  <dbl>
#1    23      0
#2    26      0
#3    32      0
#4    50      1
#5    51      1
#6    52      1

我会注意到,让用户在闪亮的应用程序中执行任意 R 代码可能不是最好的主意。使用 cut.

之类的方法可能有更好的方法来解决此问题

parse_exprs怎么样?

library(dplyr)
library(rlang)
cond <- "Age > 40 ~ 1, TRUE ~ 0"
cond <- gsub(",",";",cond)
repdata %>% mutate(result = case_when(!!!rlang::parse_exprs(cond)))
## A tibble: 10 x 2
#     Age result
#   <dbl>  <dbl>
# 1    23      0
# 2    26      0
# 3    32      0
# 4    50      1
# 5    51      1
# 6    52      1
# 7    25      0
# 8    49      1
# 9    34      0
#10    54      1

这是必需的,因为 parse_expr returns 一个表达式,而 case_when 需要 2 个或更多表达式(在代码中以逗号分隔)有 2 个案例。同时,parse_exprs returns 2个或更多表达式,但它在 ;.

上拆分表达式

数据

repdata <- tibble::tribble(~Age,23,26,32,50,51,52,25,49,34,54)