用dplyr进行准混合输入

问题描述 投票:1回答:1

我把quasiquotation带到了顶级。 我接近获得我的主 - 准机器人徽章 (见下面的编辑)。剩下一个挑战位。

使用不同的输入来使用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_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.

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

如何将这个中间装置整合到外面?

谢谢。

编辑

在审查解决方案后,最终该挑战中的问题不是引用,而是在if_else列中正确使用detect。这就是将逻辑变为字符,或者只是使伪条款相应地起作用。

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

r functional-programming dplyr purrr quasiquotes
1个回答
1
投票

我们需要用as.character换行,因为str_detect返回一个逻辑类,而falseif_else参数返回'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 
© www.soinside.com 2019 - 2024. All rights reserved.