2 votes

Utilisation de sqldf avec une variable r contenant un trait de soulignement dans son nom

Ce code

> A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
> color_num <- 2
> fn$sqldf("select * from A where col1 >= '$color_num'")

donne l'erreur

Erreur dans eval(parse(text = paste(..., sep = "")), env) : objet 'color' non trouvé

Mais si la variable color_num reçoit à la place un nom sans trait de soulignement (disons colornum ), puis en exécutant fn$sqldf("select * from A where col1 >= '$colornum'") donne les résultats attendus, sans erreur.

Je crois sqldf remplace les traits de soulignement par des points en coulisses, ce qui l'amène à traiter le composant précédant le trait de soulignement comme une table et la partie suivante comme un nom de colonne. Cette réponse (et commentaires) à une question sur les noms de colonnes dans les fichiers sqldf indique que la bibliothèque a, à un moment donné, remplacé les points par des underscores mais ne le fait plus, mais je n'ai rien trouvé sur le remplacement des underscores par des points.

C'est un problème car la convention de dénomination que j'utilise fait un usage intensif des caractères de soulignement pour les noms de variables.

Existe-t-il un moyen de faire fonctionner les noms de variables contenant des caractères de soulignement dans le système de gestion de l'information ? sqldf des requêtes ?

1voto

Mike Points 1289

Vous pouvez utiliser paste0 autour de votre sql de sorte que r évalue le color_num à 2 et les coller ensemble en un seul. sql déclaration.

library(sqldf)
    A <- data.frame(col1 = c(1,2,3),col2 = c("red","blue","green"))
    color_num <- 2

    fn$sqldf(paste0("select * from A where col1 >=",color_num))

Si vous voulez utiliser le $var et ont des difficultés avec _ voici une solution pour que toutes les variables aient . au lieu de _ , c'est probablement inefficace mais cela fonctionne.

color_col <- "blue"
#get list of values with underscores and not your df
nms <- setdiff(ls(),c("A"))
#change name of list to have '.' instead of '_'
setNames(nms,gsub("_",".",nms))
#Assign values to names with '.'s
myvars <- lapply(setNames(nms,gsub("_",".",nms)), function(x){
  assign(gsub("_",".",x) , get(x))})
#bring them to global env
list2env(myvars,.GlobalEnv)

#run example query
fn$sqldf("select * from A where col1 >= '$color.num' and col2 = '$color.col' ")

1voto

G. Grothendieck Points 40825

Vous pouvez utiliser des backticks :

fn$sqldf("select * from A where col1 >= `color_num`")
##   col1  col2
## 1    2  blue
## 2    3 green

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X