R Shiny автоматически начинает загрузку - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу инициализировать загрузку файла в R Shiny при нажатии кнопки и выполнить некоторые проверки перед генерацией файла.

Я обманулся с помощью downloadHandler (https://shiny.rstudio.com/gallery/file-download.html).Но я хочу поймать событие другой кнопки, сделать некоторые вещи и проверить данные, а когда все прошло хорошо, сгенерируйте файл и инициализируйте загрузку, не нажимая кнопку загрузки из downloadHandler.

Я имеюреализовал большинство проверок на данный момент в downloadHandler, но теперь он генерирует неудачную загрузку, когда некоторые проверки не выполняются. Мне не нравится поведение.

output$downloadData <- downloadHandler(
  filename = function() { paste("DATA_EXPORT-", Sys.Date(), ".csv", sep="") 
},
  content = function(file) {
    withProgress(message = 'Export data', value = 0, {
    # Number of steps
    n <- 3

    incProgress(1/n, detail = "Pre checks and get data")

    # checks if inputs for get_data are well defined

    dataSet <- get_data(blabla)

    incProgress(1/n, detail = "Post Proces and check")



    incProgress(1/n, detail = "generate flatfile")
    write.csv(dataSet, file, row.names = FALSE)

    })

  }
)

1 Ответ

0 голосов
/ 12 февраля 2019

Чтобы разработать мой комментарий, минимальный пример:

library(shiny)
library(shinyjs)

# function which checks the data; returns TRUE or FALSE
checkData <- function(dat){
  TRUE
}

# function which transforms the data; returns NULL if check not TRUE
processData <- function(dat){
  if(checkData(dat)){
    # do something with dat
    names(dat) <- toupper(names(dat)) # for our example
    return(dat)
  }else{
    return(NULL)
  }
}

ui <- fluidPage(
  useShinyjs(),
  conditionalPanel(
    "false", # always hide the download button
    downloadButton("downloadData")
  ),
  actionButton("check", "Download")
)

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

  dat <- mtcars

  finalData <- reactiveVal() # to store the processed data
  observeEvent(input$check, {
    if(!is.null(df <- processData(dat))){
      finalData(df)
      runjs("$('#downloadData')[0].click();")
    }else{
      # something which throws an alert message "invalid data" 
      # (eg with shinyBS::createAlert or shinyWidgets::sendSweetAlert)
    }
  })

  output$downloadData <- downloadHandler(
    filename = function() {
      paste("data-", Sys.Date(), ".csv", sep="")
    },
    content = function(file) {
      write.csv(finalData(), file)
    }
  )
}

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