Как получить case_when в dplyr принять условия от символа - PullRequest
3 голосов
/ 03 апреля 2020

Я пытаюсь использовать 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))))

, но, по-видимому, он не может понять это правильно

Ответы [ 2 ]

4 голосов
/ 03 апреля 2020

Как насчет 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 возвращает одно выражение, тогда как case_when требует 2 или более выражений (разделенных запятыми в коде), чтобы иметь 2 случая , Между тем, parse_exprs возвращает 2 или более выражений, но разделяет выражения на ;.

Данные

repdata <- tibble::tribble(~Age,23,26,32,50,51,52,25,49,34,54)
3 голосов
/ 03 апреля 2020

Это работает:

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.

...