在Shiny中下载响应式对象

12

在 shiny 中,是否可以在不创建一个额外的冗余对象实例的情况下下载对象?例如,考虑以下示例:

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

})
我对上述示例的问题在于我在renderTable()downloadHandler()调用中都运行了runQuery()。 在这个示例中,实际上并没有额外的开销,但在我的真实示例中,每当有人下载数据时,就需要运行一个长达5-10分钟的过程,因此调用两次会极其低效。是否有任何方法可以通过在downloadHandler()调用中引用已创建的对象或其他解决方法来避免这个问题?

查询能否加速?使用data.table或其他什么方法吗?如果您的查询需要那么长时间,我认为问题不在于下载处理程序。 - intra
很不幸 - 这是针对数据库的Hive查询。 - David
1个回答

18

是的!将你从两个地方调用的函数查询转换成一个反应式表达式,你可以从两个地方访问它。反应式表达式会自动缓存其结果。


谢谢Joe!我刚刚将makeQuery()和runQuery()中的工作都移动到同一个响应式函数中,这样就解决了问题。 - David
如果您需要存储先前存储的反应式值,例如rv$myResultDataFrame,该怎么办? - aloplop85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接