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))
}
}
})
}
))
Dzięki @jdharrison! Dokładnie to próbowałem zrobić :) – reinholdsson