在 Chrome 中重新加载动画 GIF 时出现问题

2023-12-31

我有一个可以重新加载 gif 动画的应用程序。它在 Safari 中始终有效,但在 Chrome 中时断时续。我相信这个问题与提到的问题类似here https://groups.google.com/forum/#!topic/shiny-discuss/9SB_uNg019M.

我对 Javascript 的了解可以忽略不计。然而,阅读this https://stackoverflow.com/questions/31346558/how-can-i-get-a-button-in-shiny-to-call-both-javascript-and-r-code-in-parallel,我想出了这个例子,仍然不行。使用 Chrome,如果您再次点击足够多次,您会发现有时图像重新加载失败。

library(shiny)
library(shinyjs)

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),

                plotOutput("anim_plot",
                           width = "900px",
                           height = "200px"),

                fluidRow(
                  column(3,  
                    actionButton("do_again", "Again")
                  )
                )
)

# Define server logic ----
server <- function(input, output) {
  observeEvent(input$do_again, {
    js$reset_anim()
    output$anim_plot <- renderImage({
      list(src = "www/tmp/ani.gif",
           contentType = 'image/gif',
           width = 900,
           alt = "Text"
      )
    }, deleteFile = FALSE)
  })
}

shinyApp(ui = ui, server = server)  

你可以找到一个 gif 动画here https://www.dropbox.com/s/ll0six5rrxkn2b2/ani.gif?dl=0.


我避免使用 renderImage 来处理这类事情。过去,我自己在这个函数上挣扎了一段时间(它对绘图很有用,但似乎不适用于真正的 png、jpeg、gif 等),所以这里是一个使用 html img() 标签作为 renderUI 输出对象的可行替代方案。看来你的 javascript 工作正常。另外,您可以只使用在线图像,我发现它比本地存储的图像效果更好

library(shiny)
library(shinyjs)

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='https://uc290691998b0891615b1f3e9397.previews.dropboxusercontent.com/p/orig/AAae6QYO7VLEEUVYdUuL985gwFGGVQ_RJ0mjLtfJt0bk3UO1ThezW4YO7R5LUzN9_m6moBjubhfX2AAnYmEkwDEjnwIw1gLOWUrOw4q_pKYYtXW-JCgghu4NuCgPKCm3RXxt3rNULvlUg-cP_Oj2vnItglJchP6a6a_lyApxTdZHwPk4Yv6jWxiYANVdFAVKxiTeHWVC5J3PYDeW8yOnaj4VGDj92eJCIXYtjpmznffo0tPUdUovNJMMW5nzsgT0L38w_5h39bcBxIwoCBmZ95iC8SRd9BGHxJMGCM4HUVh_Ly0VW3lwBxUx3O__VD5Ind-lahJwVkZjmet-HzP6XnUB/p.gif?size_mode=5', align = "right")
  })

  observeEvent(input$do_again, {
    js$reset_anim()

  })
}

shinyApp(ui = ui, server = server)  

UPDATE:
www 文件夹中包含服务器文件、ui 文件和 5 个 gif 的应用程序: 我刚刚下载了 5 个随机 gifgiphy http://giphy.com,并做了一个不循环的ezgif.com https://ezgif.com/,将它们存储为 gif1.gif、gif2.gif 等。

@OP:请记住,您的 javascript 目标是 1 个特定的 gif 对象。如果你想重新加载另一个 gif,你必须重写你的 javascript 以获取输入参数,我猜这将是你希望重新启动的 anim_plot 的名称。我不是 javascript 专家,所以我不会尝试在此处添加它,但如果您这样做,请随时将其添加到此处的信息中

附注1:不要将“www/”放入您的 src 参数中。 Shiny 会自动查找 www 文件夹内部。 。

p.s 2:请记住,有些功能在 RStudio 的内部界面中不起作用,并通过单击“运行应用程序”右侧小箭头菜单下的“运行外部”将其设置为在外部运行闪亮的应用程序播放按钮。

# File of the server.
server <- function(input, output) {

  lapply(1:5, function(image_id) { 
  output[[paste('anim_plot', image_id, sep = '')]] <- renderUI({
    img(src=paste('gif', image_id, '.gif', sep = ''), align = "right")

    })
  })

  observeEvent(input$do_again, {
    js$reset_anim()

  })
}


# File of UI ----
library(shiny)
library(shinyjs)

jsCode <- '
shinyjs.reset_anim = function(anim_plot2) {
  var div_elem = document.getElementById("anim_plot2");
  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);
}
'


ui <- fluidPage(useShinyjs(),
                extendShinyjs(text = jsCode),
                uiOutput('anim_plot1'),
                uiOutput('anim_plot2'),
                uiOutput('anim_plot3'),
                uiOutput('anim_plot4'),
                uiOutput('anim_plot5'),

                fluidRow(
                  column(3,  
                         actionButton("do_again", "Again")
                  )
                )
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Chrome 中重新加载动画 GIF 时出现问题 的相关文章

随机推荐

  • Glassfish 应用程序无法与 Maven 库(gf-client)一起使用

    在学校作业中 我收到了一个使用 JNDI 和 JMS 以及 Glassfish 3 开源版本 的 Netbeans 项目 此应用程序使用的所有 Glassfish 库均通过绝对路径引用 所有其他库 在 lib 文件夹中 均通过相对路径引用
  • 什么数据类型适合在 ActiveX 方法中处理二进制数据?

    我正在为我的朋友编写一个 ActiveX 控件 它应该封装加密例程 主要从 VB6 开始使用 我应该为加密密钥 初始化向量 输入和输出数据等二进制数据选择什么数据类型 以便我的朋友可以方便地从VB6使用它 我正在使用 Delphi 7 来编
  • Python:在 __init__ 中引发异常是一种不好的形式吗?

    在内部提出异常是否被认为是不好的形式 init 如果是这样 那么当某些类变量初始化为时抛出错误的可接受方法是什么None或者类型不正确 引发异常 init 绝对没问题 没有其他好的方法来指示初始化程序中的错误情况 并且标准库中有数百个示例
  • 在共享 Web 服务器上安装 PDFTK

    我的网站托管在 Total Choice Hosting 上 使用某种 Linux 我不知道具体是什么品种 和 Apache 我没有命令行访问权限 我只能通过 PHP 中的 exec 或通过 CRON 作业运行命令行程序 我可以在这样的系统
  • Web 服务代理设置

    在c 4 0 中 我有一个名为ManufacturerContactDetails 的Web 服务 我使用以下命令从 Windows 应用程序调用该 Web 服务 var ws new ManufacturerContactDetailsW
  • 从 TypeScript 扩展数组

    我在下面的代码中做错了什么 我正在尝试延长Array在我的课堂上MyNumberList然后尝试使用它 我看到的是 似乎没有任何项目被添加到列表中 我得到一个undefined当我尝试访问列表元素时 P S 我正在使用 TypeScript
  • 使用单独的数据库进行 papertrail 版本控制

    我正在尝试使用 papertrail 将模型的更改事件记录在单独的数据库中 我在用着 导轨 4 1 2 Ruby 2 1 纸迹 4 0 0 下面是我在关注点中添加的代码 module Foo class Base lt ActiveReco
  • 在 Pyspark 中将列类型从字符串更改为日期

    我正在尝试将列类型从字符串更改为日期 我咨询过以下人士的答案 如何将 DataFrame 中的列类型从字符串更改为日期 https stackoverflow com questions 36948012 how to change the
  • 删除了配置门户中的团队配置配置文件:*,该怎么办?

    我不小心删除了配置门户中的团队配置配置文件 我现在应该做什么 我有一台安装了 Xcode 4 2 的 MacBook 我还在 熟悉 iOS 配置门户和 Xcode 的过程中删除了 iOS 团队配置配置文件 我没有成功地恢复它 无论是从 Xc
  • 如何使用 TestCafe 和 Yaml 将屏幕截图和视频保存为 Azure Build Pipeline 中的附件?

    我正在尝试在 Azure Devops 中创建一个构建管道 运行在 TestCafe Studio 中创建的测试 保存错误屏幕截图 并保存每次测试的视频 保存测试运行的视频 将测试结果发布到测试运行 将屏幕截图和视频作为附件发布到构建管道和
  • 在经典 ASP 脚本中使用 ADO.NET

    我正在编写一些返回单个值的简单查询 并且我想从经典 ASP 的 ADO 库中获取 ADO NET ExecuteScalar 方法的行为 但是 我不想重新发明轮子 是否可以在经典 ASP 中实例化 ADO NET 的 Command 对象
  • 码头工人。 MySQL 图像。无法更改 my.cnf 文件

    我有这样一个docker compose yml database container name test db image mysql 5 7 volumes docker my cnf etc my cnf environment MY
  • 如何检测 NSString 是否包含特定字符?

    我有一个 NSString 对象 例如 45 0000 现在我想知道这个字符串是否包含 我怎样才能做到这一点 您是否想查找它是否至少包含以下一项 or 您可以使用 rangeOfCharacterFromSet NSCharacterSet
  • 复制没有历史记录的 git 存储库

    我在 GitHub 上有一个私人存储库 我想将其公开 但是 一些初始提交包含我不想公开的信息 硬编码凭据等 在不包含部分或全部提交历史记录的情况下 公开最新提交 我真的不需要或不希望公共存储库中的先前提交 的最简单方法是什么 您可以限制历史
  • 如何在Web应用程序中使复选框只读

    我有一个网格视图 每一行都有一个复选框 当进入编辑模式时 可以选中 取消选中复选框 但我不希望该复选框在任何其他模式下都是可编辑的 用户可能很容易对不反映保存回数据库中的真实值的复选框感到困惑
  • 使用for循环批量重命名文件

    我正在尝试使用 for 循环来重命名文件 Echo Off setlocal enableDelayedExpansion Set Date set mydate DATE 10 4 DATE 4 2 DATE 7 2 Rename fil
  • 拆分逗号分隔的字符串并在 C# 中添加引号 - 优雅的解决方案

    我有一个string看起来像这样 var v 10 14 18 21 并想将其用作如下所示的东西 10 14 18 21 我写了一个函数 它将值分割为comma并将它们作为字符串添加在一起 另外我删除了最后一个 从结果字符串 我把所有东西都
  • DQL 返回实体数组而不是对象

    通常 如果我运行如下所示的 DQL 查询 它将返回实体对象列表 d this gt getDoctrine gt getRepository xxxWebsiteBundle Locations gt createQueryBuilder
  • 为什么用户可以设置新密码,而无需输入与我的批处理代码正确的旧密码?

    我最近写了一个文件夹锁定程序 我唯一的问题是当我需要更改密码时 例如我去部分newpass 该程序似乎不会将旧密码与新密码进行比较 而只是使用给定的任何输入 这违背了拥有密码的目的 因为每个人都可以更改密码 而不是用它解锁文件夹 有人可以仔
  • 在 Chrome 中重新加载动画 GIF 时出现问题

    我有一个可以重新加载 gif 动画的应用程序 它在 Safari 中始终有效 但在 Chrome 中时断时续 我相信这个问题与提到的问题类似here https groups google com forum topic shiny dis