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