1

我已经将准报价提升到了最高水平。 我快要拿到我的准报价大师徽章了(见下面的编辑)。还剩下一点挑战。

使用不同的输入来创建 dplyr 的 quosures。最终结果是:

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"))

告诉我找到那些宝马的 as Serie X5,我稍后会用 just 替换它,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 的结果转换为一个字符。

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

谢谢。

编辑

在查看解决方案后,最终发现此挑战中的问题不是引用,而是在列中if_else正确使用。detect那就是将逻辑变成字符,或者只是让虚假子句相应地采取行动。

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

4

1 回答 1

1

我们需要包装 withas.character 作为str_detect返回一个逻辑类,而false参数if_else是返回“字符”。这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 
于 2019-03-15T15:30:29.347 回答