2013-08-30 1 views
5

Я создал блестящее приложение, которое использует session$clientData для получения значений параметров на сервере. Он прекрасно работает, однако, я также хотел бы иметь возможность инициировать загрузку через URL, например:Инициировать downloadHandler с clientData in Shiny

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

, а затем в server.R, что-то вроде:

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

Следовательно, можно для запуска downloadHandler() в server.R?

Спасибо!

ответ

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

Thanks @jdharrison! Это было именно то, что я пытался сделать :) – reinholdsson