2010-07-19 14 views
8

Sto provando a creare una procedura che estrae i dati da un server MySQL (utilizzando il pacchetto RODBC), esegue alcune routine statistiche su tali dati in R, quindi salva i diagrammi generati sul server tali che possono essere recuperati in un browser Web tramite un po 'di php e web magic.Salva trama R sul web server

Il mio piano è di salvare la trama in un campo BLOB MySQL utilizzando il pacchetto RODBC per eseguire un inserimento SQL in istruzione. Penso di poter inserire i dati direttamente come una stringa. Il problema è, come ottengo la stringa di dati e funzionerà anche questo? Il mio pensiero migliore è usare la funzione savePlot per salvare un file temporaneo e poi leggerlo di nuovo in qualche modo.

Qualcuno ha provato prima o ha suggerimenti su come affrontare questo?

+0

Mentre non ho mai usato R, sono quasi certo che ci sarà una sorta di funzione di serializzazione in esso ... – Wrikken

+0

Grazie, sto ora esaminando la funzione serialize() come una possibile soluzione. – stotastic

+1

Sei sicuro di volere i BLOB delle immagini nel database? Non penso che sia una buona idea, come i blob in generale - perché non le immagini come file e nomi di file in db? – mbq

risposta

2

Indipendentemente se si pensa che questo è una pessima idea, qui è una risposta di lavoro sono stato in grado di mettere insieme da questo 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) 

Prima di implementazione, farò in modo di fare qualche esame di coscienza per decidere se questo dovrebbe essere usato piuttosto che utilizzare il file system del server.

+0

Qui subisci terribili sovraccarichi I/O. Se il server MySQL si trova sulla stessa macchina del server web, la chiamata 'savePlot()' dovrebbe semplicemente scrivere il file da qualche parte che il server Web può vedere. In Apache-speak, questo significa scriverlo da qualche parte sotto DocumentRoot, o in una directory separata mappata nell'albero del documento con una direttiva Directory. Se le due macchine sono separate, lo script R deve essere eseguito sul server Web in modo che possa scrivere il file in locale, seguendo le stesse regole. In entrambi i casi, la pagina che serve l'immagine fa riferimento al file come contenuto statico, molto efficiente. –

+0

La macchina che esegue l'analisi statistica si connette al server da remoto per accedere e memorizzare i dati nel database MySQL. È un server web condiviso, quindi non penso che sembrerebbero gentilmente eseguendo routine statistiche lunghe ore sul loro server (questa è un'operazione dal budget scarso o nullo) – stotastic

+2

Ok, quindi invece di memorizzare l'immagine nel DB, con tutte le inefficienze note che crea, caricare il JPEG reso sul server web: 'system (" scp temp.jpg my.server.com:/var/www/html/images/my-analysis.jpg ")" Oh, e per inciso, probabilmente dovresti usare PNG per grafici statistici, non JPEG. –

1

La memorizzazione di immagini nei database è spesso disapprovata. Per creare un file in memoria in R puoi usare un textConnection come connessione. Questo ti darà la stringa. Funzionerà se non si dimentica di impostare il tipo mime appropriato e di aprire la connessione come binario.

0

Salvare il grafico su un server e scrivere il nome del file nel database funzionerà. Ma c'è questa cosa chiamata Rapache può aiutare. Inoltre, Jeroen Ooms ha alcuni online demo, inclusa un'interfaccia web per il famoso pacchetto R Graph di Hadley Wickham ggplot2.