Descarga automática de archivos múltiples en R-Shiny
Estoy tratando de averiguar cómo obtener unadata.frame
para subconjuntarse y luego escribir un archivo .csv para cada subconjunto. Estoy escribiendo unshiny
Aplicación que generará archivos de plantilla para diferentes instrumentos, y necesito poder obtener un archivo para cada lote / placa / lo que sea. Obviamente, podríamos hacer una clasificación manual, pero ese tipo de derrota el propósito.
En el ejemplo, digamos que tengo undata.frame
con 4 columnas nombradas 1) PlateID, 2) SampleName, 3) Well y 4) Comentarios y quiero un subconjunto por el PlateID para que cada placa individual tenga su propio archivo.
output$multiDownload <- renderText({
#templateData() just loads the data, nothing special;
#If you wanna see it let me know, but I think it's bulky
tempData <- templateData()
if(is.null(tempData)){return(NULL)}
#If there are more than one plate, subset by plate ID and write each file
if(max(tempData$PlateID) > 1){
for(i in 1:max(tempData$PlateID)){
tempSubsetForWrite <- subset(tempData, tempData$PlateID == i, select = c("names", "well", "comments"))
write.csv(tempSubsetForWrite, file = paste0("file ", i, " of ", max(tempData$PlateID), row.names = FALSE)
}
} else {
write.csv(tempData, file = "file", row.names = FALSE)
}
})
Así que quiero agregar algunas características y no estoy seguro de cómo abordarlas. Primero, me gustaría tener un mejor control de dónde se escriben los datos. Me gustaría que entrara en el mismo archivo que mis archivos de entrada, pero no estoy seguro de cómo forzar esto. Intenté hacer algo como:
inFile <- input$templateGenerationFile
write.csv(tempData, paste0(inFile$datapath, "/file ", i, " of ", max(tempData$PlateID))
pero eninFile$datapath
¡Parece ser una carpeta / archivo temporal que se genera y no un enlace directo al archivo original!
Además, estoy deseando escribir algo que actuará como undownloadHandler
en el sentido de tener un botón que descargará los archivos al hacer clic, pero no creo que pueda usar eso en este escenario porque estoy escribiendo varios archivos. Si estoy equivocado, por favor avíseme, ya que eso facilitaría la vida. Estoy pensando que voy a usar unactionButton
y una variable de contador para que el contador sea el valor del botón + 1 hasta que se active el botón, en cuyo caso son iguales hasta el final de la función. Obviamente, tendría un condicional que se encarga del resto, pero eso es trivial, ¡así que nos centramos en el subconjunto de archivos y en la descarga!
¡Gracias!