【问题标题】:How to trigger a download handler from a custom button in Shiny如何从 Shiny 中的自定义按钮触发下载处理程序
【发布时间】:2020-04-16 20:53:25
【问题描述】:

我有一个闪亮的应用程序。该应用程序包含一个表格。表格中的每一行都包含一个按钮,用户可以通过该按钮将该行中的数据下载到报告中。

我只是坚持能够将自定义行按钮连接到下载处理程序。通常我会使用下载按钮来执行此操作,但是如何使用自定义按钮来执行此操作。

我的观察活动:

observeEvent(input$lastClick,
               {
                 if (input$lastClickId%like%"letter")
                 {
                   row_to_report=as.numeric(gsub("letter_","",input$lastClickId))
                   MyLetter=RV4$data[row_to_report,]

这里如何使用downloadHandler触发下载:

                 downloadHandler(
                 filename = "letter.docx",
                 content = function(file) {
                   tempReport <- file.path(tempdir(), "letter.Rmd")
                   file.copy("letter.Rmd", tempReport, overwrite = TRUE)

                   # Set up parameters to pass to Rmd document
                   params <- list(MyLetter)

                   rmarkdown::render(tempReport, output_file = file,
                                     params = params,
                                     envir = new.env(parent = globalenv()),

                   )
                 }
               )
             }
             else if (input$lastClickId%like%"delete")
             {
               row_to_del=as.numeric(gsub("delete_","",input$lastClickId))
               RV3$data=RV3$data[-row_to_del,]
             }
           }

)

我的数据表是这样创建的:

  output$drilldownBarr <- DT::renderDT({

      if (!is.null(drilldataBarrd())) {  

        browser()
        drilldataBarrdf<-drilldataBarrd()
        drilldataBarrdf$Actions<-
         paste0('
                <div class="btn-group" role="group" aria-label="Basic example">
                <button type="button" class="btn btn-secondary letter" id=letter_',1:nrow(drilldataBarrd()),'>Letter</button>
                </div>
                ')
     }

    datatable(drilldataBarrdf,escape=F, extensions = c("Select","Buttons"), selection = "none",

              options = list(
                scrollX = TRUE,
                scrollY = TRUE,
                pageLength = 200,
                select = "api",
                dom = 'Bfrtip',
                buttons = c('copy', 'csv', 'excel', 'pdf', 'print','colvis'))
    )
  })

也许有更好的方法?例如在每一行中创建一个下载按钮。但是如何做到这一点呢?

【问题讨论】:

  • 这张桌子是怎么做的?使用DT,您可以将一些downloadButtons 放在一个列中。
  • @StéphaneLaurent 我已经展示了如何创建数据表。我想我不知道如何在每一行中创建下载按钮。完成此操作后,如何将下载按钮与仅该行的数据相关联?...

标签: r shiny


【解决方案1】:

这是一个使用 base64 编码的报告文件的解决方案。它不使用downloadHandler

library(shiny)
library(DT)
library(base64enc)
library(rmarkdown)

js <- '
Shiny.addCustomMessageHandler("download", function(b64){
  const a = document.createElement("a");
  document.body.append(a);
  a.download = "report.docx";
  a.href = b64;
  a.click();
  a.remove();
})
'

buttonHTML <- function(i){
  as.character(
    actionButton(
      paste0("button_", i), label = "Report", 
      onclick = sprintf("Shiny.setInputValue('button', %d);", i)           
    )
  )
}

dat <- iris[1:5,]
dat$Action <- sapply(1:nrow(dat), buttonHTML)

ui <- fluidPage(
  tags$head(tags$script(HTML(js))),
  br(),
  DTOutput("dtable")
)

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

  output[["dtable"]] <- renderDT({
    datatable(dat, escape = -ncol(dat)-1)
  })

  observeEvent(input[["button"]], {
    showNotification("Creating report...", type = "message")
    tmpReport <- tempfile(fileext = ".Rmd")
    file.copy("report.Rmd", tmpReport)
    outfile <- file.path(tempdir(), "report.docx")
    render(tmpReport, output_file = outfile, 
           params = list(data = dat[input[["button"]], -ncol(dat)]))
    b64 <- dataURI(
      file = outfile, 
      mime = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    )
    session$sendCustomMessage("download", b64)
  })

}

shinyApp(ui, server)

rmarkdown 文件report.Rmd

---
title: "Untitled"
author: "Stéphane Laurent"
date: "16 avril 2020"
output: word_document
params:
  data: "x"
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

```{r}
params$data
```

【讨论】:

  • 谢谢@StéphaneLaurent。您的解决方案可以正常工作,直到最后一个对话框询问我要下载到哪里。然后它只是给我一个空的下载,显示“失败 - 下载错误”,但控制台中没有错误。我也尝试在浏览器中运行该应用程序,但结果相同。我什至清空了哑剧,但还是一样。
  • @SebastianZeki 你试过我的例子(包括我的文件report.Rmd)吗?对我来说效果很好。
  • 嗨@StéphaneLaurent。是的,我确实尝试了您的示例。可能是浏览器问题。我正在使用铬。这种 mime 类型和 chrome 是否存在已知问题?你用的是哪个浏览器?
  • @SebastianZeki 我也在使用 Chrome。
  • 我很抱歉@StéphaneLaurent,我运行了某种防病毒软件,导致我的下载中断。它完美地工作。谢谢
猜你喜欢
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
相关资源
最近更新 更多