2017-06-20 1 views
4

die alte select_() Funktion verwenden, konnte ich auf einmal einen benannten Vektor in ausgewählte und Wechselposition und Spaltennamen übergeben:Wie übergibt man einen benannten Vektor an dplyr :: select mit Quoros?

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 

Ich habe versucht, etwas ähnliches quosures und Spleißen tun mit - Auswählen von Spalten funktioniert gut, aber die Die Namen der Vektoren (und damit die gleichzeitige Umbenennung von Spalten) scheinen ignoriert zu werden. Sowohl der folgenden Rückgabedatenrahmen mit Spalten namens bar und foo, aber nicht newbar und 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)) 

Gibt es eine Möglichkeit, einen Namen Vektor zu verwenden, um die neue NSE Methodologie mit umbenennen und Spalten neu anordnen?

Antwort

7

quo (oder quos für mehrere) ist für nicht-quoted Variablennamen, keine Zeichenfolgen. Zu konvertieren Strings quosures verwenden sym (oder syms) und verwenden !! oder !!! gegebenenfalls unquote oder unquote-Spleiß:

library(dplyr) 

my_data <- data_frame(foo = 0:10, bar = 10:20, meh = 20:30) 
my_newnames <- c("newbar" = "bar", "newfoo" = "foo") 

Bei Strings

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 

Für unquoted Variablennamen,

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 
Verwandte Themen