首页 > 解决方案 > 在闪亮的 R 中的下载处理程序中使用 promise 对象

问题描述

我一直在尝试在我的 Shiny 代码中使用 Futures 库,以使特定任务异步,这很耗时。这个 Future 对象的 promise 处理程序在响应式、eventReactive 和 observeEvent 中运行良好。但是当涉及到下载处理程序时,它不起作用并给我一个错误。

代码如下。我将花费时间的任务放在 Future 中。

futureData <- eventReactive(input$generateButton, {


      p <- Progress$new(session, min = 0, max = 100)
      p$set(value = 20, message = "Fetching data",detail = "This might take a while...")

      pwd <- getwd()
      future({
           setwd(pwd)
           generateReport()
           }) %>% finally({~p$set(value=100);~p$close()}) %...!% 
           (function(error) {
                print(paste("Unexpected error: ",error,error$message))
        }) 
 })



pptData <- eventReactive(futureData(), {

       futureData() %...>% {

             futureData <- .

             # Build Report Naming Convention
             pptId <- paste(futureData$pptTitle, gsub(":", "-", Sys.time()),sep = "_")
             pptFlName <- paste(pptId, ".pptx", sep = "")
             pptFile <- paste("Reports/", pptFlName, sep = "")


             return(list(
                "pptId"= pptId,
                "pptFlName"= pptFlName,
                "pptFile"= pptFile
             ))

         }
})


# Download handler on a button click
output$downloadwb <- downloadHandler(
    filename = pptData() %...>% `[[`("wbFlName"),
    content = function(file) {
    file.copy(pptData() %...>% `[[`("wbFile"), file) 
})

我收到以下错误:

警告:enc2utf8 中的错误:参数不是字符向量 [没有可用的堆栈跟踪]

你能帮我解决这个问题吗?有没有人尝试在 Shiny 的下载处理程序中使用 promise 对象?

标签: rshinyfuture

解决方案


推荐阅读