Как я могу использовать Quasiquotation в контексте tidyeval в глаголах tidyverse scopded или картографе?

У меня проблемы с использованием специального оператора := (двоеточия) в функции отображения. Я нашел обходной путь, используя глагол scoped из tidyverse, но я хотел бы знать, каким образом специальный оператор реализован в функции отображения.

По сути, я хочу переименовать набор переменных с соответствующим атрибутом метки соответственно. Я написал функцию для переименования одной переменной, но я не могу понять, как написать ее в том же стиле, используя вариант глагола с ограничением по объему или маппер.

Вот мой воспроизводимый пример:

Я могу переименовать одну переменную, делая это:

library(tidyverse)
library(sjlabelled)
library(rlang) 

data(efc)

dat <- efc %>%
  rename(!!paste("c12hour", get_label(., c12hour), sep = "_") := c12hour)

# c12_hour becomes this:
names(dat[1])
[1] "c12hour_average number of hours of care per week"

Я хочу применить эту функцию к определенному глаголу rename_all который, на мой взгляд, будет выглядеть так, но приводит к ошибке:

dat <- efc %>%
  rename_all(~!!paste(., get_label(.), sep = "_") := .)
Error: `:=` can only be used within a quasiquoted argument

Эта ошибка также появляется, когда я пытаюсь использовать маппер:

geo_rename <- as_mapper(~rename(!!paste(., get_label(.), sep = "_") := .))

dat <- efc %>%
  map_dbl(., geo_rename)
Error: `:=` can only be used within a quasiquoted argument
Call `rlang::last_error()` to see a backtrace

Я думаю, что проблема заключается в использовании := оператор, который был изобретен для квазиквотирования проблем, которые возникают в tidyeval фреймворк. Я использую это неправильно в контексте функционального программирования?

Я нашел обходной путь, сохранив метки, которые я хочу вставить в именованный список:

dat <- efc

dat_labels <- get_label(dat)
dat_recode <- as.list(as.character(dat_labels))
names(dat_recode) <- get_label(dat)

dat <- efc %>%
  select_all(~paste(., dat_recode, sep = "_"))

Но я хотел бы знать, как использовать := в функциональном программировании. В книге Хэдли Уикхема она кратко представлена, но не используется в глаголе с определенными областями или в функции картографа https://adv-r.hadley.nz/quasiquotation.html

Может кто-то объяснить это мне?

Заранее спасибо!

1 ответ

Решение

Доступные варианты, такие как rename_all() не используйте аккуратный Eval. Они как картографы в мурлыканье, или lapply():

mtcars %>% rename_all(toupper)

Или с формулой для лямбда-функций:

mtcars %>% rename_all(~ toupper(.x))

Кроме того, в случае rename_all()входной информацией для отображаемой функции является имя столбца, а не вектор столбца, который имеет атрибуты метки.

Боюсь, вам нужно найти другое решение. Оба варианта, tidy eval и scoped, находятся за пределами пространства решения этой проблемы.

Другие вопросы по тегам