如何在 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)
我正在尝试在 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)