Automatyczne pobieranie wielu plików w R-Shiny

Próbuję dowiedzieć się, jak zdobyćdata.frame do podzbioru, a następnie do napisania pliku .csv dla każdego podzbioru. Piszę ashiny aplikacja, która wygeneruje pliki szablonów dla różnych instrumentów i muszę mieć możliwość uzyskania pliku dla każdej partii / płyty / cokolwiek. Oczywiście moglibyśmy dokonać ręcznego sortowania, ale tego rodzaju pokonuje cel.

Na przykład powiedz, że mamdata.frame z 4 kolumnami o nazwach 1) PlateID, 2) SampleName, 3) Well i 4) Comments i chcę podzielić przez PlateID taki, że każda pojedyncza płyta będzie miała swój własny plik.

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)
  }
}) 

Chcę więc dodać kilka funkcji i nie jestem pewien, jak do nich podejść. Po pierwsze, chciałbym mieć lepszą kontrolę nad tym, gdzie dane są zapisywane. Chciałbym, żeby wszedł do tego samego pliku, co moje pliki wejściowe, ale nie wiem, jak to wymusić? Próbowałem zrobić coś takiego:

inFile <- input$templateGenerationFile
write.csv(tempData, paste0(inFile$datapath, "/file ", i, " of ", max(tempData$PlateID))

ale winFile$datapath wygląda na folder tymczasowy / plik, który jest generowany, a nie bezpośredni link do oryginalnego pliku!

Chcę też napisać coś, co będzie działać jakdownloadHandler w sensie posiadania przycisku, który pobierze pliki po kliknięciu, ale nie sądzę, żebym mógł użyć tego w tym scenariuszu, ponieważ piszę wiele plików. Jeśli się mylę, PROSZĘ daj mi znać, bo to ułatwiłoby życie. Myślę, że użyjęactionButton oraz zmienna licznika, tak że licznik jest wartością przycisku + 1, dopóki przycisk nie zostanie aktywowany, w którym to przypadku są one równe do końca funkcji. Oczywiście posiadałbym warunek, który obsługuje resztę, ale jest to trywialne, więc skupmy się na podzbiorze pliku i pobierz!

Dzięki!

questionAnswers(2)

yourAnswerToTheQuestion