是否可以下载闪亮的对象而无需在downloadHandler()
调用中创建该对象的单独冗余实例?例如,请考虑以下示例:
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)
}
)
})
我在上面的示例中遇到的问题是,我在runQuery()
和renderTable()
调用中都在运行downloadHandler()
。在这个例子中,实际上没有任何额外的开销,但在我的实际例子中,这需要运行5-10分钟的过程,因此每当有人下载数据时调用它两次效率极低。
我是否可以通过在downloadHandler()
电话或其他一些工作中引用已创建的对象来解决此问题?
答案 0 :(得分:18)
是的!将查询从您从两个地方调用的函数转换为您从两个位置访问的反应式表达式。反应式表达式会自动缓存其结果。