Reaktive Objekte in Shiny herunterladen

Ist es möglich, Objekte in glänzender Form herunterzuladen, ohne eine separate, redundante Instanz dieses Objekts in der zu erstellen?downloadHandler() Anruf? Betrachten Sie beispielsweise das folgende Beispiel:

ui.R

library(shiny)

shinyUI(pageWithSidebar(
  headerPanel("Simple Example"),

  sidebarPanel(
    textInput("options","Enter some content:",""),
    submitButton("Go")
  ),

  mainPanel(
    tableOutput("dataTable"),
    downloadButton('downloadData','Save Data as CSV File')
  )
))

server.R

library(shiny)

shinyServer(function(input, output) {
  makeQuery <- reactive({
      if(input$options == ""){
        return("Enter some options")
      }
      else {
        return(input$options)
      }
  })

  runQuery <- function(query){
    dat <- data.frame(v1=rep(query,5))
    return(dat)
  }

  output$dataTable <- renderTable({
    query <- makeQuery()
    if(grepl("^Enter",query)){
      return(data.frame(Error=query))
    } else {
      return(runQuery(query))
    }
  },include.rownames=FALSE)

  output$downloadData <- downloadHandler(
    filename = c('data.csv'),
    content = function(file) {
      write.csv(runQuery(makeQuery()), file)
    }
  )

})

Das Problem, das ich mit dem obigen Beispiel habe, ist, dass ich lauferunQuery() sowohl innerhalb derrenderTable() unddownloadHandler() Anrufe. In diesem Beispiel gibt es keinen zusätzlichen Aufwand, aber in meinem Beispiel muss ein Prozess von 5 bis 10 Minuten ausgeführt werden, sodass es äußerst ineffizient ist, ihn zweimal aufzurufen, wenn jemand die Daten herunterlädt.

Gibt es sowieso, dass ich dieses Problem umgehen kann, indem ich auf ein bereits erstelltes Objekt in der verweise?downloadHandler() Anruf oder eine andere Arbeit um?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage