2013-08-30 26 views
5

में क्लाइंटडाटा के साथ डाउनलोड हैंडलर आरंभ करें मैंने एक चमकदार ऐप बनाया है जो सर्वर पर पैरामीटर मान प्राप्त करने के लिए session$clientData का उपयोग करता है।चमकदार

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

और server.R तो में, की तरह कुछ:

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

इसलिए, यह संभव है यह बहुत अच्छा है, हालांकि, मैं भी यूआरएल के माध्यम से एक डाउनलोड आरंभ करने के लिए, उदाहरण के लिए सक्षम होने के लिए चाहते हैं काम करता है server.R में शुरू करने के लिए?

धन्यवाद!

उत्तर

5

मुझे यकीन नहीं है कि मैंने सही ढंग से समझ लिया है कि आप क्या करने की कोशिश कर रहे हैं। जो मैंने समझा है वह यह है कि जब आप क्वेरी स्ट्रिंग download=1 यूआरएल में मौजूद होते हैं तो डाउनलोड शुरू करना चाहते हैं। जब आवश्यक क्वेरी स्ट्रिंग का पता लगाया जाता है तो आप लिंक खोलने के लिए कुछ जावास्क्रिप्ट इंजेक्शन करके ऐसा कर सकते हैं। हालांकि कुछ समस्याएं होंगी। आपका ब्राउज़र पॉप अप को अवरुद्ध कर देगा। कोड को आग लगाने से पहले आपको पर्याप्त समय की प्रतीक्षा करनी होगी (मैंने 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

धन्यवाद @jdharrison! यह वही था जो मैं करने की कोशिश कर रहा था :) – reinholdsson