我如何在 tidyverse 作用域动词或映射器中的 tidyeval 上下文中使用 Quasiquotation?

How can I use Quasiquotation in the context of tidyeval in tidyverse scoped verbs or a mapper?

我在映射器函数中使用特殊运算符 :=(冒号等于)时遇到问题。我找到了一种使用 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 = "_"))

但是我想知道如何在函数式编程中使用:=。在哈德利·威克姆 (Hadley Wickham) 的书中对其进行了简短介绍,但并未在作用域动词或映射器函数中使用 https://adv-r.hadley.nz/quasiquotation.html#tidy-dots

谁能给我解释一下?

提前致谢!

rename_all() 等作用域变体不使用 tidy eval。它们就像 purrr 中的映射器,或者 lapply():

mtcars %>% rename_all(toupper)

或使用 lambda 函数的公式表示法:

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

此外,在rename_all()的情况下,映射函数的输入是列name,而不是具有标签属性的列向量。

所以恐怕您需要找到其他解决方案。 tidy eval 和 scoped 变体都在这个问题的解决方案之外 space。