r语言 - 准报价与 dplyr 的混合输入



我已经把准报价提升到了一个顶级水平。

我即将获得我的准配额大师徽章(请参阅下面的编辑)。 还剩下一个切伦格。

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

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_colphrase_coltarget_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替换它,但那是另一回事了。

在打印报价时,我注意到表达式运行良好,但中间商数给出了错误。

> 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.

在商数中,我有一个额外的^,即将str_detect的结果转换为字符。

如何将这种中间商数整合到外部商量中?

谢谢。

编辑

在查看解决方案后,最终发现此挑战中的问题不是引用,而是detect列中正确使用if_else。 这是将逻辑变为特征,或者只是让虚假条款相应地发挥作用。

因此,替代解决方案是从头开始设置if_else(!!cond_expr, !!inter_quo, FALSE)

我们需要用as.character包装,因为str_detect返回一个逻辑类,而if_elsefalse参数返回'character'。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 

相关内容

  • 没有找到相关文章

最新更新