[R-es] Error sql en función

Carlos Ortega cof en qualityexcellence.es
Lun Jul 27 16:01:49 CEST 2015


Puedes construir la query de esta otra forma y sí que funciona:

#----------------
library(MASS)
library(sqldf)  # Per SQL
data(Aids2, package="MASS")
SQL_PROVA = function (XDADES, XWHE )
     {
       cad_ena <- paste("select *  from", XDADES, XWHE, sep=" ")
       XDADES_SQL <- sqldf(cad_ena)
       return(XDADES_SQL)
       }
 DADES_SEL = SQL_PROVA(XDADES = "birthwt", XWHE = c("where age < 40") )
 DADES_SEL
#----------------

Fíjate también en cómo incluyo los parámetros de la llamada en la función.

Saludos,
Carlos Ortega
www.qualityexcellence.es


2015-07-27 14:14 GMT+02:00 Griera-yandex <griera en yandex.com>:

> Hola Carlos:
>
> Gracias por responder!
>
> Ayer caí en esta página al buscar el problema con google, pero no
> conseguir entender y implementar lo que sugiere. Sin entender nada, lo que
> hice fue:
>
> ========================
> > library(MASS)
> > library (sqldf)  # Per SQL
> > data(Aids2, package="MASS")
> > SQL_PROVA = function (XDADES, XWHE)
> +   {
> +   XDADES_SQL = sqldf ("select * from $XDADES $XWHE")
> +   return(XDADES_SQL)
> +   }
> > DADES_SEL = SQL_PROVA (XDADES = birthwt, XWHE = "where age < '40'")
> Error in sqliteSendQuery(con, statement, bind.data) :
>   error in statement: near "$XDADES": syntax error
> ========================
>
> Evidentemente da error.
>
> Tampoco funcionaba si introducía \"age\" en el agumento del where:
>
> ========================
> > DADES_SEL = SQL_PROVA (XDADES = birthwt, XWHE = "where \"age\" < '40'")
> Error in sqliteSendQuery(con, statement, bind.data) :
>   error in statement: near "$XDADES": syntax error
> ========================
>
> He buscado ejemplos con google. pero no he encontrado nada.
>
> Gracias y saludos.
>
>
> On Mon, 27 Jul 2015 12:45:50 +0200
> Carlos Ortega <cof en qualityexcellence.es> wrote:
>
> > Hola,
> >
> > Mira la página de "sqldf" en GitHub, viene un ejemplo, entre otras muchas
> > cosas, que lo explica:
> >
> > https://github.com/ggrothendieck/sqldf#Example_5._Insert_Variables
> >
> > #------------------------------
> > # 5
> > minSL <- 7
> > limit <- 3
> > fn$sqldf('select * from iris where "Sepal.Length" > $minSL limit $limit')
> > #------------------------------
> >
> > Saludos,
> > Carlos Ortega
> > www.qualityexcellence.es
> >
> >
> > 2015-07-27 12:00 GMT+02:00 Griera <griera en yandex.com>:
> >
> > > Hola:
> > >
> > > No consigo que la función sqldf () funcione dentro de una función.
> Alguien
> > > puede echarme una mano. En resumen, el problema es que cuando lo
> ejecuto
> > > fuera de una función no tengo ningún problema:
> > >
> > > ==========================
> > > > # install.packages("sqldf")
> > > > library(MASS)
> > > > library (sqldf)
> > > > data(Aids2, package="MASS")
> > > > options(digits=3)
> > >
> > > > table (Aids2$state)
> > >   NSW Other   QLD   VIC
> > >  1780   249   226   588
> > >
> > > > max (Aids2$age)
> > > [1] 82
> > >
> > > > # Sin función:
> > > > DADES_SEL = sqldf ("select * from Aids2 where state in ('NSW', 'QLD')
> > > and age < 40")
> > >
> > > > table (DADES_SEL$state)
> > >   NSW Other   QLD   VIC
> > >  1102     0   128     0
> > >
> > > > max (DADES_SEL$age)
> > > [1] 39
> > > ==========================
> > >
> > > Pero dentro de una función no se como pasarle los argumentos para que
> > > funcione:
> > >
> > > ==========================
> > > > SQL_PROVA = function (XDADES, XWHE)
> > > +   {
> > > +   XDADES_SQL = sqldf (paste ("select * from", XDADES, XWHE, sep = "
> "))
> > > +   return(XDADES_SQL)
> > > +   }
> > > > DADES_SEL = SQL_PROVA (XDADES = birthwt, XWHE = "where age < '40'")
> > > Error in sqliteSendQuery(con, statement, bind.data) :
> > >   error in statement: near "fromc": syntax error
> > > ==========================
> > >
> > > Alguien puede ayudarme y decir que estoy haciendo mal? El problema debe
> > > estar en el "paste" ya que si coloco la orden original funciona:
> > >
> > > ==========================
> > > > SQL_PROVA = function (XDADES, XWHE)
> > > +   {
> > > +   XDADES_SQL2 = sqldf ("select * from Aids2 where state in ('NSW',
> > > 'QLD') and age < 40")
> > > +   return(XDADES_SQL2)
> > > +   }
> > >
> > > > DADES_SEL2 = SQL_PROVA (XDADES = birthwt, XWHE = "where age < '40'")
> > >
> > > > table (DADES_SEL2$state)
> > >   NSW Other   QLD   VIC
> > >  1102     0   128     0
> > >
> > > > max (DADES_SEL2$age)
> > > [1] 39
> > > ==========================
> > >
> > > Muchas gracias y saludos.
> > >
> > > _______________________________________________
> > > R-help-es mailing list
> > > R-help-es en r-project.org
> > > https://stat.ethz.ch/mailman/listinfo/r-help-es
> > >
> >
> >
> >
> > --
> > Saludos,
> > Carlos Ortega
> > www.qualityexcellence.es
>



-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es