首页 > 解决方案 > downloadHandler 使用 R Shiny 下载图像时出错

问题描述

最近几天我一直在尝试添加一个按钮以在我闪亮的应用程序中下载图像,但我无法获得它。我以前用其他应用程序做过,但是这个不起作用。该应用程序选择两个(或三个)图像并将它们与您想要的透明度合并。应用程序中的图像看起来很完美,问题仅在于下载。服务器代码如下;

library(shiny)
library(abind)
library(jpeg)
library(rsconnect)

shinyServer(function(input, output) {

  
output$myImage <- renderImage({
  # A temp file to save the output.

  # Return a list containing the filename and alt text

  
  
  outfile <- tempfile(fileext = '.png')
  
  image1 = jpeg::readJPEG(file.path(
                                    paste(input$map1,'.jpeg', sep='')))
  
  image2 = jpeg::readJPEG(file.path(
                                              paste(input$map2,'.jpeg', sep='')))
  
  image3 = jpeg::readJPEG(file.path(
    paste(input$map3,'.jpeg', sep='')))


  
  image1 = abind::abind(image1, image1[,,1]) # add an alpha channel
  image1[,,4] = input$trans1 # set alpha to semi-transparent
  
  image2 = abind::abind(image2, image2[,,1]) # add an alpha channel
  image2[,,4] = input$trans2

  image3 = abind::abind(image3, image3[,,1]) # add an alpha channel
  image3[,,4] = input$trans3
  
  if(input$n==0){
    png(outfile, width = 4, height = 4, units = 'in', res = 300)
    par(mai=c(0,0,0,0))
    plot.new()
    rasterImage(image1, 0, 0, 1, 1)
    rasterImage(image2, 0, 0, 1, 1)
    dev.off()
  }
  
  if(input$n==1){
    png(outfile, width = 2, height = 2, units = 'in', res = 300)
    par(mai=c(0,0,0,0))
    plot.new()
    rasterImage(image1, 0, 0, 1, 1)
    rasterImage(image2, 0, 0, 1, 1)
    
    rasterImage(image3, 0, 0, 1, 1)
    dev.off()
  }
  
  
  
  # Return a list containing the filename
  list(src = outfile,
       contentType = 'image/png',
       width = 600,
       height = 400,
       alt = "This is alternate text")
  
  
}, deleteFile = FALSE)


output$downloadImage <- downloadHandler(
  filename = "Image.png",
  contentType = "image/png",
  content = function(file) {
    ## copy the file from the updated image location to the final download location
    file.copy(outfile, file)
  }
)  


}

用户界面代码如下:

library(abind)
library(shiny)
library(rsconnect)
library(jpeg)
library(shiny)
library(shinyBS)
library(shinyjs)

shinyUI(fluidPage(

  
  tags$head(tags$style(
    HTML('
         #sidebar {
     float: right;

         background-color: white;
         border-bottom: 1px solid #e6e6e6;
         border-radius: 0;
         
         }
         
         body, label, input, button, select { 
     font-family: "Open Sans", Arial, sans-serif;
         }')
  )),
  
  sidebarLayout(position = "right",
    sidebarPanel(
   
    
      
      selectInput(inputId = "map1",
                  label = "Mapa 1:",
                  choices = c("Mapa 1","Mapa 2","Mapa 3","Mapa 4","Mapa 5"),
                  selected = "Normal"),
    
      
      sliderInput(inputId = "trans1",
                 label = "Transparencia mapa 1:",
                 min = 0, max = 1, value = 0.5, step = 0.1),
      
   selectInput(inputId = "map2",label = "Mapa 2:",
                                                                 choices = c("Mapa 1","Mapa 2","Mapa 3","Mapa 4","Mapa 5"),
                                                                 selected = "Normal"),
      
      
      sliderInput(inputId = "trans2",label = "Transparencia mapa 2:",
                                                                 min = 0, max = 1, value = 0.5, step = 0.1),  
    

      hr(),
   
  checkboxInput( "n", "Anadir otro mapa:",FALSE), 
  
  hr(),
   
   
            conditionalPanel(condition = "input.n==1", selectInput(inputId = "map3",label = "Mapa 3:",
                         choices = c("Mapa 1","Mapa 2","Mapa 3","Mapa 4","Mapa 5"),
                         selected = "Normal")),
             
             
  conditionalPanel(condition = "input.n==1", sliderInput(inputId = "trans3",label = "Transparencia mapa 3:",
                         min = 0, max = 1, value = 0.5, step = 0.1)
   )
   ,
      hr()
      ,
  downloadButton('downloadImage', 'Download modified image'),
  
  hr()
    ),
    mainPanel(
      imageOutput("myImage")
  )
)))

当我推送下载时,第一件事不是尝试下载“Image.png”,而是说下载没有扩展名的文件“downloadImage”。然后,如果我接受它会给出以下错误:

错误

有人知道哪个是错误吗?我绝望了!

谢谢

标签: rimageerror-handlingshinydownload

解决方案


outfile在 中定义renderImage,然后在 中不存在downloadHandler。所以在你的server函数的根部定义它:

shinyServer(function(input, output) {

  outfile <- tempfile(fileext = '.png')
  
  output$myImage <- renderImage({
    ......

推荐阅读