代码之家  ›  专栏  ›  技术社区  ›  Diego-MX

dplyr准液体运动的混合输入

  •  0
  • Diego-MX  · 技术社区  · 5 年前

    我把准液体运动带到了一个最高层。 我马上就要拿到我的准液体大师徽章了 (见下面的编辑)还有一个车头。

    使用不同的输入创建带有dplyr的qousores最终结果是:

    the_quote <- quo( if_else(!!cond_expr, !!inter_quo, !!var_expr) )
    

    我已经成功地从一个带有字符串的自定义表构造了上面的表达式,如下所示:

    var_expr <- as.name(rules_df$target_col)
    
    cond_expr <- "make == '%s'" %>% sprintf(rules_df$context_col) %>% parse_expr()
    
    inter_quo <- quo( 
        str_detect( !!var_expr, regex(!!rules_df$phrase_col) ))
    

    在哪里 context_col 我是说, phrase_col 我是说, target_col 是一个表中的字符串列,我已经定义了约定规则。

    例子:

    rules_df <- data_frame(
        context_col = "BMW", 
        phrase_col  = "Serie X(\\d)", 
        target_col  = "model")
    
    cars_table <- data_frame(
        make = c("Mercedes", "BMW", "BMW"), 
        model = c("Viano", "Serie X5", "Z4"))
    

    告诉我找到那些宝马的 Serie X5 ,稍后我将用 X5 但那是另一个故事。

    在打印引用时,我注意到表达式工作得很好,但中间Quosure给出了一个错误。

    > the_quote
    <quosure>
      expr: ^if_else(marca == "BMW", 
                ^str_detect(model, regex("Serie X(\d)")), model)
      env:  000000002001DEE0
    
    > mutate(cars_table, detect = !!the_quote)
    Error: Evaluation error: `false` must be type logical, not character.
    

    在Quosure我有一个额外的 ^ 它将str_detect的结果转换为字符。

    我该如何将这个中间部分整合到外部部分?

    谢谢。

    编辑

    在审查解决方案时,发现本次挑战中的问题不是引用,而是使用 if_else 正确地 detect 列。那就是把逻辑转换成字符,或者让假子句相应地起作用。

    因此,另一种解决方案是 if_else(!!cond_expr, !!inter_quo, FALSE) 从一开始。

    0 回复  |  直到 5 年前
        1
  •  1
  •   akrun    5 年前

    我们需要用 as.character 作为 str_detect 返回逻辑类,而 false 参数 if_else 正在返回“字符”这个 否则 对这个班很挑剔因此,如果我们这样做

    inter_quo <- quo( as.character(str_detect( !!var_expr, 
                   regex(!!rules_df$phrase_col) )))
    

    那就应该有用了

    mutate(cars_table, detect = !!the_quote)
    # A tibble: 3 x 3
    #  make     model    detect
    #  <chr>    <chr>    <chr> 
    #1 Mercedes Viano    Viano 
    #2 BMW      Serie X5 TRUE  
    #3 BMW      Z4       FALSE