问题描述
a <- "A"
bquote(tibble::tibble(a = 1:10) %>% dplyr::mutate(`=`(.(as.name(a)),a*2))) %>% eval()
# A tibble: 10 x 2
a `A = a * 2`
<int> <dbl>
1 1 2
2 2 4
3 3 6
4 4 8
5 5 10
6 6 12
7 7 14
8 8 16
9 9 18
10 10 20
很显然,列名不正确。应该是A。
但是,如果我这样做:
a <- "A"
bquote(tibble::tibble(a = 1:10) %>% dplyr::mutate(.(as.name(a)) = a*2)) %>% eval()
Error: unexpected '=' in "bquote(tibble::tibble(a = 1:10) %>% dplyr::mutate(.(as.name(a)) ="
解决方法
tidyverse工具有自己的元编程方式,不涉及bquote
和eval()
。相反,您会这样做
tibble::tibble(!!a := 1:10) %>% dplyr::mutate(!!a := .data[[a]]*2)
:=
让您动态分配参数名称。有关更多信息,请查看vignette("programming","dplyr")