Я хотел бы программно переименовать столбец (используя одну переданную переменную) в конвейере dplyr. Я создал минимальный пример ниже с комментариями. Последняя пара попыток работает. Но они чувствуют себя странно. Действительно ли это лучший способ достижения моего результата в тидиверсе? Если нет, то что? Кроме того, почему !!
оценивает слева, а не str_c()
?
Я все еще чувствую, что я не ворчу, как думать в тидиверсе - особенно когда это касается :=
, !!!
, !!
, ~
, vars()
, funs()
, enquo()
и т. Д., Операторы и функции.
library(tidyverse)
OLD_COL_NAME <- "disp"
NEW_COL_NAME <- "PREFIX_disp"
# Gives desired result, but would prefer not to pass `NEW_COL_NAME`
mtcars %>%
rename(!!NEW_COL_NAME := !!OLD_COL_NAME)
# mpg cyl PREFIX_disp hp drat wt qsec vs am gear carb
# Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
# Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
# Thought this would give BOTH desired result and functionality.
# Surprisingly to me, didn't work.
mtcars %>%
rename(str_c("PREFIX_", !!OLD_COL_NAME) := !!OLD_COL_NAME)
# Error: The LHS of `:=` must be a string or a symbol
# Also surprinsigly, this didn't work either
mtcars %>%
rename(!!str_c("PREFIX_", !!OLD_COL_NAME) := !!OLD_COL_NAME)
# Error in !OLD_COL_NAME : invalid argument type
# Gives desired result. But clunky. Is this really the best-practices approach
# in the tidyverse?
mtcars %>%
rename_at(vars(!!OLD_COL_NAME), funs(str_c("PREFIX_", !!OLD_COL_NAME)))
# Gives desired result. Less clunky. Again, is this the best-practices approach?
mtcars %>%
rename_at(vars(!!OLD_COL_NAME), ~ str_c("PREFIX_", .x))