2010-08-10 4 views
6

Estoy utilizando una biblioteca RSQLite en R para administrar un conjunto de datos demasiado grande para la RAM. Para cada regresión, consulto en la base de datos para recuperar un año fiscal a la vez. Ahora tengo el año fiscal modificable:Consulta de RSQLite con la variable especificada por el usuario en el campo DONDE

data.annual <- dbGetQuery(db, "SELECT * FROM annual WHERE fyear==2008") 

me gustaría hacer el año fiscal (2008 arriba) para hacer cambios un poco más fácil (y a prueba de tontos). ¿Hay alguna manera de que pueda pasar una variable en una cadena de consulta SQL? Me gustaría utilizar:

fiscal.year <- 2008 
data.annual <- dbGetQuery(db, "SELECT * FROM annual WHERE fyear==fiscal.year") 
+0

Similar uno: http://stackoverflow.com/questions/3416973/dynamic-string-in-r – Marek

Respuesta

9

SQLite sólo verá la cadena transmitido durante la consulta, por lo que lo que haces es algo así como

sqlcmd <- paste("SELECT * FROM annual WHERE fiscal=", fiscal.year, sep="") 
    data.annual <- dbGetQuery(db, sqlcmd) 

Lo bueno es que se puede utilizar este el habitual forma de desenrollar los bucles. Olvidando por un momento que usted tiene restricciones de carnero, conceptualmente se puede hacer

years <- seq(2000,2010) 
    data <- lapply(years, function(y) { 
    dbGetQuery(db, paste("SELECT * FROM annual WHERE fiscal=", y, sep="") 
    } 

y ahora datos es una lista que contiene todos los conjuntos de datos anuales. O puede guardar los datos, ejecutar su regresión y solo almacenar el objeto de resumen.

+0

¡Guau! Necesito internalizar esta idea de crear una cadena con 'paste' y pasarla como argumento. ¡Gracias! –

3

La respuesta de Dirk es perfecta. Una pequeña cosa que trato de hacer es cambiar el formato para una prueba fácil. Parece que tengo que cortar y pegar el texto SQL en un editor SQL muchas veces. Por lo tanto, formato como el siguiente:

sqlcmd <- paste(" 
    SELECT * 
    FROM annual 
    WHERE fiscal= 
", fiscal.year, sep="") 
data.annual <- dbGetQuery(db, sqlcmd) 

Esto sólo hace que sea más fácil de cortar y pegar los bits de SQL de entrada/salida para la prueba en el entorno de consultas DB. No es gran cosa con una consulta corta, pero puede ser engorroso con una cadena SQL más larga.

+0

¿Quieres decir que lo pegas desde un buffer de emacs en otro buffer de emacs? ;-) –

+0

ouch .. ouch ... dejaron de empujarme allí. duele. Ay. –

+0

y con eso quiero decir "deja de mirarme a los ojos con mi evidente infrautilización de emacs" –

Cuestiones relacionadas