Как передать именованный вектор в 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
Другие вопросы по тегам