Как передать именованный вектор в dplyr::select с помощью кавычек?
Используя старый select_()
Функция, я мог бы передать именованный вектор в select и изменить позиции и имена столбцов сразу:
my_data <- data_frame(foo = 0:10, bar = 10:20, meh = 20:30)
my_newnames <- c("newbar" = "bar", "newfoo" = "foo")
move_stuff <- function(df, newnames) {
select_(df, .dots = newnames)
}
move_stuff(my_data, newnames = my_newnames) )
# this is the desired output
# A tibble: 4 x 2
newbar newfoo
<int> <int>
1 10 0
2 11 1
3 12 2
4 13 3
Я попытался сделать что-то подобное, используя кавычки и сплайсинг - выбор столбцов работает отлично, но имена векторов (и, следовательно, переименование столбцов одновременно), похоже, игнорируются Оба следующих возвращаемых фрейма данных с именованными столбцами bar
а также foo
, но нет newbar
а также newfoo
:
move_stuff2 <- function(df, newnames) {
select(df, !!!newnames)
}
# returns df with columns bar and foo
move_stuff2(my_data, quo(my_newnames))
move_stuff2(my_data, quos(my_newnames))
Есть ли способ использовать именованный вектор с использованием новой методологии NSE для переименования и изменения порядка столбцов?
1 ответ
quo
(или же quos
для нескольких) для имен переменных без кавычек, а не для строк. Для преобразования строк в предложения используйте sym
(или же syms
) и использовать !!
или же !!!
в зависимости от ситуации, чтобы отменить кавычки или слить цитаты:
library(dplyr)
my_data <- data_frame(foo = 0:10, bar = 10:20, meh = 20:30)
my_newnames <- c("newbar" = "bar", "newfoo" = "foo")
Для строк,
move_stuff_se <- function(df, ...){
df %>% select(!!!rlang::syms(...))
}
move_stuff_se(my_data, my_newnames)
#> # A tibble: 11 x 2
#> newbar newfoo
#> <int> <int>
#> 1 10 0
#> 2 11 1
#> 3 12 2
#> 4 13 3
#> 5 14 4
#> 6 15 5
#> 7 16 6
#> 8 17 7
#> 9 18 8
#> 10 19 9
#> 11 20 10
Для имен переменных без кавычек,
move_stuff_nse <- function(df, ...){
df %>% select(!!!quos(...))
}
move_stuff_nse(my_data, newbar = bar, newfoo = foo)
#> # A tibble: 11 x 2
#> newbar newfoo
#> <int> <int>
#> 1 10 0
#> 2 11 1
#> 3 12 2
#> 4 13 3
#> 5 14 4
#> 6 15 5
#> 7 16 6
#> 8 17 7
#> 9 18 8
#> 10 19 9
#> 11 20 10