2013-11-25 3 views
8

Ho un'applicazione lucida funzionante, ma la sto cambiando in modo che i dati di input siano reattivi - si aggiornerà quando i dati sottostanti si aggiornano. Ha funzionato bene quando ha appena letto i dati, ma ora che i dati sono reattivi sto avendo problemi con uno dei file (altri due funzionano esattamente come previsto). Il file è un .csv che viene esportato da un database e vorrei fare un po 'di pulizia prima di usare - cambiare alcuni nomi e formattare alcuni dati. La parte rilevante è:Formattazione data.frames reattivo in lucido

server.r 

W.Data<-reactiveFileReader(2000,session, 
      "WaterData.csv",read.csv,header=TRUE,as.is=TRUE) 

Questo funziona bene, ma poi le prossime due linee non funzionano:

names(W.Data())[names(W.Data())=="Visit_Start_Date"]<-"Visit.Date" 
W.Data()$Visit.Date<-as.Date(W.Data()$Visit.Date,"%m/%d/%Y") 

Quando ho eseguito questo ho

Error in W.Data()$VisitDate <- as.Date(W.Data()$VisitDate, "%m/%d/%Y"): 
invalid (NULL) left side of assignment 

e simile per l'altra linea. Che cosa sta succedendo qui? Posso fare questo genere di cose con un data.frame che viene letto da reactiveFileInput? Ho provato a cambiare i nomi nel file .csv sottostante per avere caratteri di sottolineatura anziché spazi, e ho provato a inserire le espressioni names() e as.Date() nelle espressioni reactive(), ma queste non hanno fatto alcuna differenza.

Grazie

risposta

13

sto rispondendo alla mia domanda in gran parte per dire che mi veniva un imbecille. Una volta che il file viene letto usando reactiveFileReader() diventa una "sorgente reattiva". Come spiegato nel brillante tutorial here, le fonti reattive vengono modificate dall'esterno: un utente che inserisce un nuovo valore o, in questo caso, un aggiornamento del file. Non è possibile modificarlo dall'interno dello server.r.

Quindi, per il mio caso ho utilizzato le opzioni col.names e colClasses in read.csv() per ottenere i dati originali nel formato migliore che potevo. Ho anche sfruttato l'utilissima funzione setAs per ottenere read.csv per capire come formattare la data, come spiegato qui: Specify date format for colClasses argument ....

Da lì, tutte le nuove colonne che avevo bisogno di creare dai dati doveva essere fatto come un oggetto separato utilizzando una funzione reattiva come questo:

NewThing<-reactive({ function(MyReacitveCSVdata()$colname) }) 

E poi NewThing() a sua volta può essere utilizzato tuttavia si desiderio. In questo modo è possibile aggirare problemi come i valori dei caratteri in una colonna altrimenti numerica. Se si tenta di farlo entrare usando colClasses="numeric" si avrà un errore e il read.csv() avrà esito negativo. Invece prima importa la colonna come "carattere" e poi usa reactive({}) con as.numeric() per assegnarlo a un nuovo oggetto. Assicurati di notare che il nuovo oggetto non può essere una nuova colonna nel data.frame che hai inserito usando reactiveFileReader(), invece deve essere un nuovo oggetto che dipende da quello data.frame.

+0

@ John Paul. Sembra che io abbia lo stesso problema simile a quello che hai avuto in questo post. Tuttavia, non ho potuto risolvere il mio problema in base alle tue intuizioni. Qualche idea su come risolvere il mio problema. Sotto il link della domanda. Grazie. http://stackoverflow.com/questions/37736782/add-new-variable-column-in-the-fly-to-a-reactive-dataframe-in-shiny?noredirect=1#comment63045945_37736782 – SimonB