Curly curly передача имени столбца в mutate или regex_left_join возвращает ошибку, не удалось найти оператор присваивания `:=`

#r #tidyverse #tidyeval #fuzzyjoin

#r #tidyverse #tidyeval #fuzzyjoin

Вопрос:

Я получаю сообщение об ошибке в консоли:

Ошибка := ({ : не удалось найти функцию «:=»

Я использую только пакеты fuzzyjoin (автор Дэвид Робинсон) и tidyverse. Функция принята без синтаксических ошибок. При выполнении мне выдается ошибка. В чем может быть причина?

  df_recode_brand_name <- 
    tibble(
      regex_name  = c("wacoal|tempt", "calvin", "hanky", "victoria"),
      return_name = c("wacoal",       "calvin", "hanky", "victoria"))
  
  df_recode_product_category <- 
    tibble(
      regex_name  = c("lingerie", "pant", "bra", "undies"),
      return_name = c("lingerie", "pant", "bra", "undies"))
  
  
fn_regex_recode <- function(df, df_recode_dic, col_name) {
    df %>% regex_left_join(
      df_recode_dic, 
      by = c({{col_name}} := "regex_name"),
      ignore_case = T ) %>% 
    mutate({{col_name}} := if_else(is.na(return_name), str_to_lower({{col_name}}), return_name)) %>% 
    select(-regex_name, -return_name)  
  }

df_raw2 <-  
    df_raw %>%  
    fn_regex_recode(df_recode_brand_name,brand_name) %>% 
    fn_regex_recode(df_recode_product_category, product_category)
  

Вот пример данных

 df_raw <-
tibble::tribble(
                ~brand_name,                                  ~product_category,           ~description,
             "Calvin Klein",              "Women - Lingerie amp; Shapewear - Bras", "Practice bold, fearl",
                   "Wacoal",                                             "Bras", "Beautiful all over c",
        "Victoria's Secret",                           "Add-2-Cups Push-Up Bra", "The ultimate lift-lo",
                   "Wacoal",     "Women - Lingerie amp; Shapewear - Sexy Lingerie", "With luscious lace a",
        "Victoria's Secret",                 "Incredible by Victoria Sport Bra", "Tackle high-intensit",
             "Calvin Klein", "Women - Lingerie amp; Shapewear - Designer Lingerie", "Moderate coverage th",
        "Victoria's Secret",                        "Wicked Unlined Uplift Bra", "A little lift goes a",
        "Victoria's Secret",                     "Crochet Lace Cheekster Panty", "The prettiest croche",
        "Victoria's Secret",                           "Curved-hem Thong Panty",  "Seriously sleek and",
        "Victoria's Secret",                           "Add-2-Cups Push-Up Bra", "The ultimate lift-lo",
        "Victoria's Secret",                             "Perfect Coverage Bra", "Our fullest coverage",
               "US TOPSHOP",                                         "Lingerie", "Revamp your lingerie",
             "Calvin Klein",                                        "Sleepwear", "a modern cotton loun",
                    "AERIE",           "Everyday Loves Undies 7 for $27.50 USD", "Introducing Everyday",
      "b.tempt'd by Wacoal", "Women - Lingerie amp; Shapewear - Designer Lingerie",  "Sheer and sexy, the",
                   "Wacoal",              "Women - Lingerie amp; Shapewear - Bras", "Discover the glove-l",
   "Victoria's Secret Pink",                      "Wear Everywhere Push-Up Bra", "An everyday fave wit",
                   "WACOAL",                                          "PANTIES", "A sheer lace panty t",
        "Victoria's Secret",                          "Add-1?-Cups Push-Up Bra", "This push-up gives y",
                   "Wacoal",                                             "Bras", "Sport bra offers gre"
  )
  

Комментарии:

1. := Оператор from data.table , not tidyverse .

2. Нет, он также используется пакетами tidyverse

3. Я считаю, что подстановка работает правильно, но тогда у вас все еще остается a := в вашем c() вызове, что вызывает проблему. Может быть, если вы используете функцию tidyverse, например, vctrs::vec_c() она будет работать. Еще попробуйте ответ Ронака, где вы должны иметь возможность использовать {{}} вместо substitute .

Ответ №1:

Попробуйте использовать setNames in by для передачи именованного вектора.

 library(dplyr)
library(fuzzyjoin)
library(rlang)

  fn_regex_recode <- function(df, df_recode_dic, col_name) {
    val <- deparse(substitute(col_name))
    df %>% 
      regex_left_join(
        df_recode_dic, 
        by = setNames('regex_name', val),ignore_case = TRUE) %>%
      mutate({{col_name}} := if_else(is.na(return_name), str_to_lower({{col_name}}), return_name)) %>% 
      select(-regex_name, -return_name) 
  }
  

Комментарии:

1. Он выдает синтаксическую ошибку Error: unexpected ‘}’ в: » select(-regex_name, -return_name) }»

2. Можете ли вы привести пример df_raw ?

3. Спасибо за помощь. Я прикрепил образец данных к вопросу.

4. Кстати, я вижу, что проблема только с regex_left_join, но не с dplyr::mutate

5. deparse(substitute() не является надежным, он может возвращать вектор длины> 1. as_label(substitute(arg)) или as_string(ensym(arg)) у вас нет этой проблемы.