2010-07-19 11 views
8

Estoy tratando de crear un procedimiento que extraiga datos de un servidor MySQL (usando el paquete RODBC), realice algunas rutinas estadísticas sobre esos datos en R y luego guarde las gráficas generadas en el servidor que se pueden recuperar en un navegador web a través de un poco de php y magia web.Guarde el gráfico R en el servidor web

Mi plan es guardar la trama en un campo BLOB MySQL mediante el uso del paquete RODBC para ejecutar una instrucción SQL insert into. Creo que puedo insertar los datos directamente como una cadena. El problema es, ¿cómo obtengo la cadena de datos y esto funcionará? Mi mejor pensamiento es usar la función savePlot para guardar un archivo temporal y luego volver a leerlo de alguna manera.

¿Alguien ha intentado esto antes o tiene sugerencias sobre cómo abordar esto?

+0

Aunque nunca he usado R, estoy casi seguro de que habrá algún tipo de función de serialización en él ... – Wrikken

+0

Gracias, ahora estoy viendo la función serialize() como una posible solución. – stotastic

+1

¿Estás seguro de que deseas imágenes en la base de datos? No creo que sea una buena idea, como blobs en general, ¿por qué no imágenes como archivos y nombres de archivo en db? – mbq

Respuesta

2

Independientemente de si usted piensa que esto es una idea terrible, aquí es una respuesta de trabajo pude juntar de esta post

## open connection 
library(RODBC) 
channel <- odbcConnect("") 

## generate a plot and save it to a temp file 
x <- rnorm(100,0,1) 
hist(x, col="light blue") 
savePlot("temp.jpg", type="jpeg") 

## read back in the temp file as binary 
plot_binary <- paste(readBin("temp.jpg", what="raw", n=1e6), collapse="") 

## insert it into a table 
sqlQuery(channel, paste("insert into test values (1, x'",plot_binary,"')", sep="")) 

## close connection 
odbcClose(channel) 

Antes de la implementación, me aseguraré de hacer un examen de conciencia para decida si esto debería usarse en lugar de usar el sistema de archivos de los servidores.

+0

Estás incurriendo en gastos generales de E/S terribles aquí. Si el servidor MySQL está en la misma máquina que el servidor web, su llamada 'savePlot()' debería simplemente escribir el archivo en alguna parte que el servidor web pueda ver. En Apache-speak, esto significa escribirlo en algún lugar debajo de DocumentRoot, o en un directorio separado mapeado en el árbol de documentos con una directiva de Directorio. Si las dos máquinas están separadas, la secuencia de comandos R debe ejecutarse en el servidor web para que pueda escribir el archivo localmente, siguiendo las mismas reglas. De cualquier manera, la página que sirve la imagen hace referencia al archivo como contenido estático, muy eficiente. –

+0

La máquina que realiza el análisis estadístico se conecta al servidor de forma remota para acceder y almacenar datos en la base de datos MySQL. Es un servidor web compartido, por lo que no creo que tengan en cuenta amablemente ejecutar rutinas estadísticas de una hora en su servidor (esta es una operación de presupuesto baja o nula) – stotastic

+2

Bien, así que en lugar de almacenar la imagen en el DB, con todas las ineficiencias conocidas que crea, carga el JPEG renderizado al servidor web: 'system (" scp temp.jpg my.server.com:/var/www/html/images/my-analysis.jpg ")' Ah, y por cierto, probablemente deberías estar usando PNG para gráficos estadísticos, no JPEG. –

1

Almacenar imágenes en bases de datos a menudo es desaprobado. Para crear un archivo en la memoria en R, puede usar un textConnection como conexión. Esto te dará la cadena. Funcionará si no olvida configurar el tipo de mime adecuado y abrir la conexión como binario.

0

Guardar la trama en un servidor y escribir el nombre de archivo en la base de datos funcionará. Pero hay algo llamado Rapache que puede ayudar. Además, Jeroen Ooms tiene algunos en línea demo, incluida una interfaz web para el famoso paquete R Graph de Hadley Wickham, ggplot2.

Cuestiones relacionadas