2013-08-30 31 views
5

Tôi đã tạo một ứng dụng sáng bóng sử dụng session$clientData để nhận các giá trị tham số cho máy chủ. Nó hoạt động rất tốt, tuy nhiên, tôi cũng muốn để có thể bắt đầu tải xuống thông qua url, ví dụ:Bắt đầu tải xuốngHandler với clientData trong Shiny

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

và sau đó trong server.R, một cái gì đó như:

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

Do đó, là nó có thể để bắt đầu downloadHandler() trong server.R?

Cảm ơn!

Trả lời

5

Tôi không chắc mình đã hiểu chính xác những gì bạn đang cố gắng làm. Điều tôi đã hiểu là bạn muốn bắt đầu tải xuống khi chuỗi truy vấn download=1 xuất hiện trong url. Bạn có thể làm điều này bằng cách tiêm một số javascript để mở liên kết khi chuỗi truy vấn bắt buộc được phát hiện. Tuy nhiên, sẽ có một số vấn đề. Trình duyệt của bạn rất có thể sẽ chặn cửa sổ bật lên. Bạn sẽ cần phải chờ đủ thời gian trước khi bạn kích hoạt mã (tôi đã chọn 5 giây).

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

Cảm ơn @jdharrison! Đây chính xác là những gì tôi đang cố gắng làm :) – reinholdsson