`downloadHandler`: как изящно завершить работу при сбое загрузки (нет данных)? - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть downloadButton с downloadHandler, когда мы хотим загрузить данные, мне нужно запустить процедуру, чтобы выяснить, есть ли данные для загрузки.

Я не могу найти способ Отменить обработчик загрузки, приложение ниже предлагает нам сохранить какой-нибудь мусор HTML файл.

Как мы можем получить чистый выход downloadHandler?

library(shiny)

ui <- fluidPage(

  downloadButton("btn", "Download")
)

server <- function(input, output, session) {

  output$btn <- downloadHandler(
    filename = function(){
      "out.txt"
    },
    content = function(file){

# this example always fails.
      if(TRUE){
        print("Sorry, data not written.")
        return(NULL)
      } else {
        writeLines(mtcars, "out.txt")
      }

    }

  )

}

shinyApp(ui, server)

1 Ответ

2 голосов
/ 21 февраля 2020

AFAIK, невозможно отменить загрузку после нажатия кнопки.

Вот способ загрузки файла без использования downloadHandler. Он состоит в создании элемента a, и после нажатия кнопки файл, который вы хотите загрузить, преобразуется в кодировку base64, а с помощью shinyjs::runjs строка base64 присваивается атрибуту href a элемент и щелчок по элементу a срабатывает.

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  checkboxInput("data", "Data"),
  actionButton("btn", "Download"),
  tags$a(id = "dwnld")
)

server <- function(input, output, session) {

  observeEvent(input$btn, {
    if(input$data){
      tmpFile <- tempfile()
      write.table(iris, tmpFile)
      b64 <- base64enc::dataURI(file=tmpFile, mime="text/plain")
      runjs(sprintf('$("#dwnld").attr("href", "%s").attr("download", "out.txt")', b64))
      runjs("$('#dwnld')[0].click();")
    }else{
      runjs("alert('No data!');")
    }
  })

}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...