r - 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”。然后,如果我接受它会给出以下错误:
有人知道哪个是错误吗?我绝望了!
谢谢
解决方案
outfile
在 中定义renderImage
,然后在 中不存在downloadHandler
。所以在你的server
函数的根部定义它:
shinyServer(function(input, output) {
outfile <- tempfile(fileext = '.png')
output$myImage <- renderImage({
......
推荐阅读
- java - Java Spring Boot Webflux cors 被阻止
- typescript - Duet Date Picker 中的 Aurelia 绑定值
- javascript - googleapis 包 - oAuth2 获取令牌返回 [invalid_grant 错误请求]
- python - 如何重新采样每小时时间序列以在特定时间开始并在 24 小时后结束
- php - 更改phpunit中依赖方法的参数值
- recursion - 二叉树中高度为 h 的子树
- r - 无法使用“Corr.test”功能查看相关性
- ruby - 仅当工作进程 puma> 1 时,我才失去与 Ruby + Sinatra + puma + sequel 的用户会话
- javascript - 如何在表单查找期间将隐藏的 SQL ID 字段值与其他数据一起传递?
- selenium - Selenium Grid 和 pytest-xdist 插件有什么区别?