5

我创建了一个闪亮的应用程序,用于session$clientData获取服务器的参数值。它很好用,但是,我也希望能够通过 url 启动下载,例如:

localhost:8100/?plot=a&title=mytitle&download=1

然后在 中server.R,类似:

if(session$clientData$download == "1"){
  download()
} 

因此,是否可以启动downloadHandler()in server.R

谢谢!

4

1 回答 1

5

我不确定我是否正确理解了您要执行的操作。我的理解是,您希望download=1在 url 中存在查询字符串时启动下载。您可以通过在检测到所需的查询字符串时注入一些 javascript 打开链接来做到这一点。不过会有一些问题。您的浏览器很可能会阻止弹出窗口。在触发代码之前,您需要等待足够长的时间(我选择了 5 秒)。

require(shiny)
runApp(list(
  ui = bootstrapPage(
    tags$head(tags$script(HTML('
      Shiny.addCustomMessageHandler("jsCode",
        function(message) {
          eval(message.value);
        }
      );
    '))),
    downloadLink('downloadData', 'Download'),
    verbatimTextOutput("summary")
  ),
  server = function(input, output, session) {
    data <- seq(100)
    output$downloadData <- downloadHandler(
      filename = function() {
        paste('data-', Sys.Date(), '.csv', sep='')
      },
      content = function(file) {
        write.csv(data, file)
      }
    )

    output$summary <- renderText({
      cnames <- names(session$clientData)

      allvalues <- lapply(cnames, function(name) {
        item <- session$clientData[[name]]
        if (is.list(item)) {
          list_to_string(item, name)
        } else {
          paste(name, item, sep=" = ")
        }
      })
      paste(allvalues, collapse = "\n")
    })

    observe({
      query <- parseQueryString(session$clientData$url_search)
      if(!is.null(query$download)){
        if(query$download == 1){
          jsinject <- "setTimeout(function(){window.open($('#downloadData').attr('href'))}, 5000);"
          session$sendCustomMessage(type = 'jsCode', list(value = jsinject))          
        }
      } 
    })
  }
))
于 2013-09-01T07:06:54.707 回答