12

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

サーバー.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()の両方で実行していることです。この例では余分なオーバーヘッドはありませんが、実際の例では 5 ~ 10 分のプロセスを実行する必要があるため、誰かがデータをダウンロードするたびに 2 回呼び出すのは非常に非効率的です。renderTable()downloadHandler()

downloadHandler()呼び出しで既に作成されたオブジェクトを参照するか、その他の回避策を講じることで、この問題を回避できる方法はありますか?

4

1 に答える 1

18

はい!2 つの場所から呼び出す関数からのクエリを、2 つの場所からアクセスするリアクティブ式に変換します。リアクティブ式は、結果を自動的にキャッシュします。

于 2013-06-25T02:46:20.857 に答える