Как я могу использовать 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, находятся за пределами пространства решения этой проблемы.