HaoranWu_ZJU 2021-03-29 08:38 采纳率: 25%
浏览 55

Rshiny输出pdf损坏问题

尝试利用RShiny在网页中设置Download按钮,下载ggplot2绘制的图(存储在`graph`变量中),但存储到本地后打开pdf,出现“文件已经损坏”。代码如下

## Only run examples in interactive R sessions
if (interactive()) {
  
  ui <- fluidPage(
    downloadLink(outputId = "downloadGraph", 
                 label = "Download")
  )
  
  server <- function(input, output) {
    # Our dataset
    data <- mtcars
    
    output$downloadGraph <- downloadHandler(
      filename = function() {
        paste("graph-", Sys.Date(), ".pdf", sep="")
      },
      content = function(file) {
        pdf(file)
        graph  # ggplot2绘图存储的变量
        dev.off()
      }
    )
  }
  
  shinyApp(ui, server)
}
  • 写回答

2条回答 默认 最新

  • 你知我知皆知 2024-07-23 20:44
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    这个问题是由于RShiny在处理PDF内容时遇到的问题。RShiny使用了R中的base64库来将数据转换为可打印的Base64格式,然后将其保存为PDF。但是,当用户尝试从本地下载这个PDF时,它可能因为一些原因而无法正确解码。

    一种解决方案是将PDF的内容直接写入一个字节流,并使用writeBits()函数来生成Base64编码的数据。这样可以避免使用base64库和解决任何潜在的安全问题。以下是一个修改后的版本:

    library(shiny)
    
    ui <- fluidPage(
      downloadLink(outputId = "downloadGraph", 
                   label = "Download"),
      divOutput("output")
    )
    
    server <- function(input, output) {
      data <- mtcars
      
      output$downloadGraph <- downloadHandler(
        filename = function() {
          paste("graph-", Sys.Date(), ".pdf", sep="")
        },
        content = function(file) {
          writeBits(0x89504E474154454346452C3F3A383B,
                    file, length(graph))
        }
      )
    }
    
    shinyApp(ui, server)
    

    在这个示例中,我们首先创建了一个包含我们的数据的字节流。然后,我们将这个字节流写入到指定的PDF文件中。这应该能解决您遇到的问题。

    评论

报告相同问题?