【问题标题】:How to get case_when in dplyr accept conditions from character如何在 dplyr 中获取 case_when 接受字符的条件
【发布时间】:2020-04-03 01:29:18
【问题描述】:

我正在尝试在闪亮的应用程序中使用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))))

但是,显然,没有把它做对

【问题讨论】:

    标签: r dplyr case-when rlang


    【解决方案1】:

    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 个 case。同时,parse_exprs 返回 2 个或更多表达式,但它在 ; 上拆分表达式。​​

    数据

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

    【讨论】:

      【解决方案2】:

      这行得通:

      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 之类的东西可能有更好的方法来解决这个问题。

      【讨论】:

        猜你喜欢
        • 2021-09-17
        • 2021-09-30
        • 2022-01-22
        • 1970-01-01
        • 2020-09-16
        • 1970-01-01
        • 2021-09-20
        • 2018-05-31
        • 1970-01-01
        相关资源
        最近更新 更多