在 Shiny 上渲染或下载动画 GIF
Posted
技术标签:
【中文标题】在 Shiny 上渲染或下载动画 GIF【英文标题】:Render or download animated GIF on Shiny 【发布时间】:2018-08-07 09:16:25 【问题描述】:我打算制作一个闪亮的应用程序,用户上传一个包含位置数据的文件,应用程序返回一个显示这些位置数据的动画 gif(在完成一些计算之后)。当应用程序在我的计算机上本地运行时,一切正常。
此外,在线运行时,大多数元素都能正常工作。我无法弄清楚的是,当应用程序部署在 shinyapps.io 时,如何将动画 gif 返回给用户。无论我尝试通过 renderImage 还是在 downloadButton 中返回它,都会出现问题。
我尝试过无数种 SaveGIF 和 gganimate 的组合,以及 downloadHandler 或 renderImage。我曾在here、here 和here 中寻找灵感,仅举几例。 我也看到过类似问题的帖子(例如,here)。我慢慢开始对此失去理智,非常感谢解决方案或提示。
我很确定关于闪亮在线的内部文件存储规则和系统,我只是不明白。例如,将(计算的)数据的 png 文件返回到 renderImage 或 downloadHandler(如here) 工作正常。但是,当输出格式为 gif 时,我永远不会正确。
下面显示了一个使用 renderImage 的尝试。我已经从文件输入的东西中抽象出来了,所以下面的最小可重现示例制作了一个简单的虚拟数据集,并在单独的图片中动画后将其放入临时目录。当应用程序在审阅窗格中时,它可以正常工作。部署后,我得到“这是替代文本”。似乎我可以在临时目录中看到单个图像,但不知何故动画 GIF 丢失了。关于如何在浏览器中以图像或准备下载的文件的形式返回动画 GIF 的解决方案或提示,我会非常高兴,不会激动。
library(shiny)
library(animation)
#UI
ui <- basicPage(
imageOutput("plot1")
)
#Server
server <- function(input, output)
data1_reactive <- reactive(
x <- c(1,2,3)
y <- c(2,4,5)
data_try <- data.frame(x,y)
return(data_try)
)
output$plot1 <- renderImage(
saveGIF(
for (i in 1:3)
plot(data1_reactive()$x,data1_reactive()$y,type="p",col="black",xlim=c(0,10),ylim=c(0,10),pch=19)
lines(data1_reactive()[i,]$x,data1_reactive()[i,]$y,type="p",col="red",xlim=c(0,10),ylim=c(0,10),pch=19)
ani.pause(), movie.name = 'test.gif', interval = 0.3,ani.width = 1400, ani.height = 900,outdir=tempdir())
# Return a list containing the filename
list(src = paste0(tempdir(),"/test.gif"),
contentType = 'image/gif',
alt = "This is alternate text"
), deleteFile = FALSE)
shinyApp(ui, server)
【问题讨论】:
你见过这个吗? groups.google.com/forum/#!topic/shiny-discuss/32WtTVOqYK0。看看温斯顿的回答。 是的,至少我见过类似的方法。如果我应该合并 Winston 的评论,我会像这样更改 output$plot1:。但是,不幸的是,我得到了完全相同的结果。在 saveGIF 之前,我会添加: filename 【参考方案1】:https://groups.google.com/forum/#!msg/shiny-discuss/1Pq_awTkj_A/g7jsk6AWjqQJ 实际上,saveGIF 中的 outdir 参数存在一个错误。幸运的是,作者已经解决了这个问题。您可以摆脱 outdir=...,并保留 movie.name = 'test.gif'。 src = paste0(tempdir(),"/test.gif" 下面的部分应该更改为 src='test.gif'。应该可以!
【讨论】:
您好安吉拉,感谢您的意见。您可以通过建议的修复程序使其在在线版本中工作吗?不幸的是,我仍然得到“这是替代文本”并且没有显示 GIF。让我强调一下,它在离线审查窗格中运行良好 - 当它在在线 Shiny 版本中启动时似乎会出现问题。 嗨,Ellesar!我只是意识到它仍然不起作用。之前在线Shiny版本上会显示gif,因为我上传了离线版本生成的gif。所以实际上它是一个假的。我认为问题与库 SaveGIF 有关。它需要ImageMagick软件,在线Shiny版本中可能没有。以上是关于在 Shiny 上渲染或下载动画 GIF的主要内容,如果未能解决你的问题,请参考以下文章
KeyShot 9 Pro for Mac(3D渲染和动画制作) 9.0.289