2017-09-13 2 views
2

Je cherche un moyen de concaténer une quosure et une chaîne dont le résultat est une quosure. En fait, si j'utilise paste0() et quo_name(), je peux le faire. Mais je me demande s'il existe une alternative plus élégante pour écrire une fonction dans mon paquet. Ceci est un exemple générique:concaténer quosures et string

library(dplyr) 

df <- data_frame(
    z_1 = 1, 
    z_2 = 2, 
    y_1 = 10, 
    y_2 = 20 
) 

get_var <- function(.data, var) { 
    xx = enquo(var) 

    select(.data, paste0(quo_name(xx), "_1"), paste0(quo_name(xx), "_2")) 
} 

get_var(df, z) 
# A tibble: 1 x 2 
    z_1 z_2 
    <dbl> <dbl> 
1  1  2 

Répondre

2

Sans fonction, voici comment vous le faites en utilisant dplyr:

library(dplyr) 
df %>% 
    select(starts_with("z_")) 

Vous pouvez également créer une fonction et passer dans une chaîne pour le nom de la variable comme celui-ci :

get_var= function(df, var){ 
    df %>% 
    select(starts_with(paste0(var, "_"))) 
} 

get_var(df, "z") 

maintenant, la partie la plus délicate vient quand vous essayez de passer dans le nom de la variable sans le citer en fonction (le code de R, et non pas la valeur qu'il contient). Une façon de le faire serait deparse + substitute R. base Ce convertit le symbole fourni var à une chaîne, ce qui est pratique pour une utilisation ultérieure dans la fonction:

get_var = function(df, var){ 
    var_quo = deparse(substitute(var)) 
    df %>% 
    select(starts_with(paste0(var_quo, "_"))) 
} 

Enfin, voici comment faire la même chose avec enquo et quo_name dans rlang/tidyverse package:

library(rlang) 
get_var = function(df, var){ 
    var_quo = quo_name(enquo(var)) 
    df %>% 
    select(starts_with(paste0(var_quo, "_"))) 
} 

get_var(df, z) 
get_var(df, y) 

Résultat:

# A tibble: 1 x 2 
    z_1 z_2 
    <dbl> <dbl> 
1  1  2 

# A tibble: 1 × 2 
    y_1 y_2 
    <dbl> <dbl> 
1 10 20 

Notes:

  1. quosures sont des expressions qui cite gardent la trace d'un environnement.
  2. enquo prend un symbole faisant référence à l'argument d'une fonction, cite le code R et l'associe à l'environnement de la fonction dans une quosure. Formate une quosure en une chaîne, qui peut être utilisée plus tard dans la fonction.
  3. quo_text est similaire à quo_name mais ne vérifie pas si l'entrée est un symbole.

Vérifiez ces:

  1. rlang documentation
  2. Non-Standard Evaluation in R
  3. ?enquo
  4. ?quo_name
+0

Si vous pouvez passer un nom de variable à votre sélection, je vais upvote. 'starts_with' est l'approche que j'utiliserais – CPak

+0

@CPark je vois. Donc vous voulez pouvoir passer la variable elle-même et pas une chaîne comme '" z "'? Par exemple, 'get_var (df," z ")' ne serait pas satisfaisant? – useR

+1

Je ne suis pas le OP btw. Fondamentalement, OP veut définir une fonction où la trame de données et la colonne à sélectionner sont transmises dynamiquement en tant qu'arguments. – CPak