本文介绍了在SHILINE中下载反应性对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以在downloadHandler()调用中不创建该对象的独立、冗余实例的情况下在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()调用中引用已创建的对象或某些其他解决方法来解决此问题?

推荐答案

是!将从两个位置调用的函数的查询转换为从两个位置访问的反应式表达式。反应表达式自动缓存其结果。

这篇关于在SHILINE中下载反应性对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 04:05