2013-08-30 7 views
5

Utworzyłem błyszczącą aplikację, która używa session$clientData, aby pobrać wartości parametrów do serwera. Działa świetnie, jednak chciałbym również, aby móc zainicjować pobieranie przez URL, np:Zainicjuj pobieranieHandler z clientData w Shiny

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

a potem w server.R, coś takiego:

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

Stąd jest możliwe zainicjować downloadHandler() w server.R?

Dzięki!

Odpowiedz

5

Nie jestem pewien, czy poprawnie zrozumiałem, co próbujesz zrobić. Zrozumiałem, że chciałbyś, aby pobieranie zostało zainicjowane, gdy w adresie URL pojawi się ciąg zapytania download=1. Można to zrobić, wstrzykując trochę javascriptu, aby otworzyć łącze po wykryciu wymaganego ciągu zapytania. Pojawią się jednak pewne problemy. Twoja przeglądarka najprawdopodobniej zablokuje wyskakujące okienko. Musisz poczekać dostatecznie długo zanim wystrzeli kod (wybrałam 5 sekund).

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

Dzięki @jdharrison! Dokładnie to próbowałem zrobić :) – reinholdsson