我花了最后几天尝试添加一个按钮,以将图像下载到我 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”文件。然后,如果我接受,则会出现以下错误: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/