【问题标题】:Problem when reloading an animated GIF in Chrome - Part II在 Chrome 中重新加载动画 GIF 时出现问题 - 第二部分
【发布时间】:2019-03-28 17:08:59
【问题描述】:

继续 Mark 的建议 here 我现在使用 uiOutputrenderUI

下面的代码显示了一个动画 gif(“anone”)。当按下“再次”按钮时,它会以我不完全理解的方式使用 Javascript 重置 Chrome,然后通过用另一个动画 gif(“anitwo”)覆盖原始动画 gif 来模拟我的更大程序。

但是,“anitwo”不显示,“anione”显示。我可以查看本地文件并查看它是否已写入并通过在 Chrome 中打开它成功查看。如何查看同名的不同文件?

我意识到我对“www/tmp/ani.gif”和“tmp/ani.gif”的使用不一致,并且理解闪亮在“www”中查找文件。然而,如果没有这些不一致,我会得到文件未找到错误。

ani.gif 和 ani2.gif 是 here

library(shiny)
library(shinyjs)
library(magick)

jsCode <- '
shinyjs.reset_anim = function() {
  var div_elem = document.getElementById("anim_plot");
  var img_elem = div_elem.getElementsByTagName("img")[0];
  var src_value = img_elem.getAttribute("src");
  img_elem.setAttribute("src", "");
  img_elem.setAttribute("src", src_value);
}
'


# Define UI ----
ui <- fluidPage(useShinyjs(),
                extendShinyjs(text = jsCode),
                uiOutput('anim_plot'),
                fluidRow(
                  column(3,  
                         actionButton("do_again", "Again")
                  )
                )
)

# Define server logic ----
server <- function(input, output) {


  output$anim_plot <- renderUI({
    img(src = 'tmp/ani.gif',
        width = '900')
  })

  observeEvent(input$do_again, {
    print("Again")
    js$reset_anim()

    # When Again clicked, simulate the creation of a new animated gif by reading in a file and 
    # over writing the old one. Try displaying this new animated gif.

    img2 <- image_read("www/tmp/ani2.gif")
    image_write(img2, path = "www/tmp/ani.gif")

    output$anim_plot <- renderUI({
      img(src = 'tmp/ani.gif',
          width = '900')
    })
  })
}

shinyApp(ui = ui, server = server)  

【问题讨论】:

  • 我看到经常回答我自己问题的 Stephane 发布了一个很好的答案。顺便说一句,我很好奇你是如何在你的应用程序中制作 GIF 的,因为我可能会在我正在构建的自己的程序中使用它。
  • 辛苦工作由 Thomas Lin Pedersen 的转换器包完成:github.com/thomasp85/transformr。如果你可以得到任何你想变形为简单特征对象的形状(cran.r-project.org/web/packages/sf/vignettes/sf1.html),那么转换器可以为你生成一个动画 gif。
  • 啊,这可能不适合制作那里的情节或png的gif

标签: javascript r google-chrome shiny


【解决方案1】:

你就不能这样做

library(shiny)

# Define UI ----
ui <- fluidPage(
  uiOutput('anim_plot'),
  fluidRow(
    column(3,  
           actionButton("do_again", "Again")
    )
  )
)

# Define server logic ----
server <- function(input, output) {

  gif <- reactiveVal("ani.gif")

  observeEvent(input$do_again, {
    gif("ani2.gif")
  })

  output$anim_plot <- renderUI({
    img(src = gif(), width = "256")
  })

}

shinyApp(ui = ui, server = server)  

【讨论】:

  • 非常优雅的解决方案,根本不需要 javascript 我会说 Stéphane
  • 我喜欢没有 Javascript。但是,它对我不起作用。我认为问题在于,在我的 R 脚本中,字母变形没有 ani2.gif。该脚本将符号变形为用户输入的单词。生成的动画 gif 始终存储为 ani.gif。这就是为什么在我的示例中我总是显示ani.gif。 ani2.gif 只是下一个被创建并保存为 ani.gif 的动画 gif 的替身。
  • 有没有办法手动告诉“反应值”对象,“gif”它已经改变了?
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2020-04-21
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多