Non-standard de l'évaluation (NSE) dans dplyr de filter_ & extraction de données de MySQL
Je voudrais tirer quelques données d'un serveur sql avec un filtre dynamique. Je suis l'aide de la grande package R dplyr de la manière suivante:
#Create the filter
filter_criteria = ~ column1 %in% some_vector
#Connect to the database
connection <- src_mysql(dbname <- "mydbname",
user <- "myusername",
password <- "mypwd",
host <- "myhost")
#Get data
data <- connection %>%
tbl("mytable") %>% #Specify which table
filter_(.dots = filter_criteria) %>% #non standard evaluation filter
collect() #Pull data
Ce bout de code fonctionne très bien, mais maintenant, je voudrais boucle en quelque sorte sur toutes les colonnes de ma table, donc je voudrais écrire le filtre:
#Dynamic filter
i <- 2 #With a loop on this i for instance
which_column <- paste0("column",i)
filter_criteria <- ~ which_column %in% some_vector
Et réappliquez le premier code avec le filtre de mise à jour.
Malheureusement, cette approche ne donne pas les résultats escomptés. En fait, il ne donne pas d'erreur mais n'a pas encore tirer aucun résultat dans R.
En particulier, j'ai regardé un peu dans la requête SQL générée par les deux morceaux de code et il y a une différence importante.
Tandis que le premier, le travail, le code génère une requête de la forme:
SELECT ... FROM ... WHERE
`column1` IN ....
("signe dans la colonne nom), le second génère une requête de la forme:
SELECT ... FROM ... WHERE
'column1' IN ....
("signe dans la colonne nom)
Quelqu'un a une suggestion sur la manière de formuler les conditions de filtrage pour le faire fonctionner?
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas vraiment lié à SQL. Cet exemple ne fonctionne pas non plus:
Il ne fonctionne pas parce que vous avez besoin pour passer à
filter_
l'expression~ v1 == 1
— pas l'expression~ "v1" == 1
.Pour résoudre le problème, il suffit d'utiliser la citation de l'opérateur
quo
et la dequoting opérateur!!
Une solution alternative, avec dplyr version 0.5.0 (probablement mis en œuvre plus tôt), il est possible de passer d'un composé de la chaîne de la .points argument, que je trouve plus lisible que la lazyeval::interp solution:
Mise à JOUR pour dplyr 0,6 et plus tard:
(Similaire à @Matthieu 's réponse pour dplyr 0.6, mais je suppose que which_col est une variable de chaîne.)
2e mise à JOUR: Edwin Thoen créé une belle triche pour ranger évaluation: https://edwinth.github.io/blog/dplyr-recipes/
Ici est un peu moins verbeux solution et un qui utilise le comportement typique de l'extrait de fonction,
'['
en sélectionnant une colonne par la valeur du caractère plutôt que de le convertir en un élément de langage:filter(df, '['(df, which_column) == 1)