Смешанный ввод в квазиквотации с dplyr - PullRequest
1 голос
/ 15 марта 2019

Я поднял квази-цитату на высший уровень. Я близок к получению своего мастер-квазиквотатора (см. Правки ниже). Остался один бит с челленджем.

Использование различных входных данных для создания предложений с помощью 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_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"))

Говорит мне, чтобы найти те BMW как 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 в символ.

Как мне интегрировать это промежуточное предложение во внешнее?

Спасибо.

Редактировать

После рассмотрения решения выясняется, что проблема в этой задаче заключалась не в предложении, а в правильном использовании if_else в столбце detect. Это меняет логический характер или просто действует ложное предложение.

Таким образом, альтернативное решение - установить if_else(!!cond_expr, !!inter_quo, FALSE) с самого начала.

1 Ответ

1 голос
/ 15 марта 2019

Нам нужно заключить в as.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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...