Аккуратная оценка при переименовании столбцов в dplyr

Я пытаюсь динамически переименовать один столбец в фрейме данных, используя rename() с синтаксисом tidy Assessment, выпущенным в _ 2_ v0.7.0.

На странице справки ?rename я нашел следующий пример переименования 2 столбцов.

library(dplyr)

vars <- c(var1 = "cyl", var2 ="am")
rename(mtcars, !!vars) %>% head(1)

>           mpg var1 disp  hp drat   wt  qsec vs var2 gear carb
> Mazda RX4  21    6  160 110  3.9 2.62 16.46  0    1    4    4

Однако я заметил, что не могу использовать тот же синтаксис для переименования одного столбца.

vars <- c(var1 = "cyl")
rename(mtcars, !!vars) %>% head(1)

> Error: All arguments must be named

Тем не менее, когда я дважды переименовываю один и тот же столбец, это работает.

vars <- c(var1 = "cyl", var1 = "cyl")
rename(mtcars, !!vars) %>% head(1)

>           mpg var1 disp  hp drat   wt  qsec vs am gear carb
> Mazda RX4  21    6  160 110  3.9 2.62 16.46  0  1    4    4

Почему это происходит? Какой правильный синтаксис?


person Megatron    schedule 24.09.2018    source источник
comment
Проблема с апстримом: github.com/tidyverse/tidyselect/issues/77   -  person Lionel Henry    schedule 24.09.2018


Ответы (1)


Используйте !!! для оценки

rename(mtcars, !!!vars) %>% 
     head(1)
#          mpg var1 disp  hp drat   wt  qsec vs am gear carb
#Mazda RX4  21    6  160 110  3.9 2.62 16.46  0  1    4    4
person akrun    schedule 24.09.2018
comment
Спасибо. Есть идеи, почему оценка !! выдает ошибку, если указан только 1 столбец? - person Megatron; 24.09.2018
comment
@Megatron Немного удивительно, что !! работает с более чем одним элементом. Если вы измените его на list, то первый вариант не сработает. Внутри может быть так, что с вектором длины 1 имя удаляется - person akrun; 24.09.2018
comment
Есть идеи, где я могу найти новую аккуратную формальную спецификацию eval? Я никогда раньше не видел оператора !!!. Также переименование элемента ›1 осуществляется прямо со страницы справки. Я думаю, что проблема вектора / списка должна быть ошибкой. - person Megatron; 24.09.2018
comment
Это похоже на ошибку, я зарегистрировал проблему: github.com/tidyverse/tidyselect/issues/ 77 - person Lionel Henry; 24.09.2018