Formateo de data.frames reactivos en Shiny

Tengo una aplicación que funciona bien, pero la estoy cambiando para que los datos de entrada sean reactivos: se actualizará cuando se actualicen los datos subyacentes. Funcionó bien cuando acaba de leer en los datos, pero ahora que los datos son reactivos tengo problemas con uno de los archivos (otros dos funcionan como se esperaba). El archivo es un .csv que se exporta desde una base de datos, y me gustaría hacer un poco de mantenimiento antes de usar – cambiar algunos nombres y formatear algunos datos. La parte relevante es:

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

Esto funciona bien, pero las siguientes dos líneas no funcionarán:

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

Cuando corro esto, me sale

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

y similar para la otra línea. ¿Que esta pasando aqui? ¿Puedo hacer este tipo de cosas con un data.frame que se lee desde reactiveFileInput ? Traté de cambiar los nombres en el archivo .csv subyacente para poner guiones bajos en lugar de espacios, e intenté poner los names() y as.Date() en expresiones reactive() , pero estas no hicieron ninguna diferencia.

Gracias

Estoy respondiendo a mi propia pregunta en gran medida para decir que estaba siendo un nincompoop. Una vez que se lee el archivo con reactiveFileReader() se convierte en una “fuente reactiva”. Como se explica en el shiny tutorial aquí, las fonts reactivas se modifican desde el exterior: un usuario ingresa un nuevo valor, o en este caso, una actualización del archivo. No puede modificarlo desde el server.r . server.r

Entonces, en mi caso, utilicé las opciones col.names y colClasses en read.csv() para obtener los datos originales en el mejor formato que pude. También setAs útil función setAs para hacer que read.csv entienda cómo formatear la fecha, como se explica aquí: Especifique el formato de fecha para el argumento colClasses ….

Desde allí, todas las columnas nuevas que necesitaba crear a partir de los datos tenían que hacerse como un objeto separado usando una función reactiva como esta:

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

Y luego NewThing() a su vez puede usarse como lo desee. Así es como puede evitar problemas como los valores de los caracteres en una columna que de otro modo sería numérica. Si intenta simplemente ingresarlo usando colClasses="numeric" obtendrá un error y el read.csv() fallará. En su lugar, primero importe la columna como "carácter" y luego use reactive({}) con as.numeric() para asignarlo a un nuevo objeto. Asegúrese de tener en cuenta que el nuevo objeto no puede ser una nueva columna en el data.frame que introdujo con reactiveFileReader() , sino que debe ser un objeto nuevo que depende de ese data.frame .