我已经将准报价提升到了最高水平。 我快要拿到我的准报价大师徽章了(见下面的编辑)。还剩下一点挑战。
使用不同的输入来创建 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)
从头开始设置。