r - downloadHandler在使用R Shiny下载图像时出错

标签 r image error-handling shiny download

我花了最后几天尝试添加一个按钮,以将图像下载到我 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)
  }
)  


}
ui代码如下:
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")
  )
)))
当我 push 下载时,第一件事不是尝试下载“Image.png”,而是说下载没有扩展名的“downloadImage”文件。然后,如果我接受,则会出现以下错误:
Error
Anyobdy知道哪个错误?我很绝望!
谢谢

最佳答案

outfile是在renderImage内部定义的,因此在downloadHandler中不存在。因此,请在server函数的根目录中定义它:

shinyServer(function(input, output) {

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

关于r - downloadHandler在使用R Shiny下载图像时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63483105/

相关文章:

R:分配因子水平的有效方法

r - 如何将 Janitor::tabyl 应用于数据表上的几列?

android - Android中随机改变背景图片

java - Windows 7 64 位中使用 Graphics2D 使图像变暗的问题

swift - 'CGRectGetMaxX'已由属性 'CGRect.maxX'替换为swift错误

javascript - 在 JavaScript 中扩展 Error 的好方法是什么?

r - 如何使用 R 中的条件删除 NA?

r - 如何让\bm{} 在 R markdown(到 HTML)文件中工作?

html - 图像和文本一行大小问题

installation - 是否有 Julia 和 Atom 组合的稳定版本可以按照说明进行安装?