Проблема при перезагрузке анимированного GIF в Chrome - PullRequest
3 голосов
/ 18 марта 2019

У меня есть приложение, которое перезагружает анимированный GIF.Он работает все время в Safari и периодически в Chrome.Я считаю, что проблема похожа на упомянутую здесь .

Мои знания Javascript незначительны.Однако, прочитав this , я придумал этот пример, который все еще не работает.Используя 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 .

1 Ответ

3 голосов
/ 26 марта 2019

Я избегаю использования 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)  

ОБНОВЛЕНИЕ:
Приложение с файлом на сервере, файлом пользовательского интерфейса и 5 GIF-файлами.в папке www: я только что скачал 5 случайных картинок с giphy и сделал один, чтобы не зацикливаться с ezgif.com , сохранил их как gif1.gif, gif2.gif и т. д.

@ OP: Имейте в виду, что ваш JavaScript нацелен на 1 конкретный объект GIF.Если вы хотите перезагрузить другой gif, вам придется переписать свой javascript, чтобы получить входной аргумент, который будет именем вашего anim_plot n, который вы хотите перезапустить, я думаю.Я не эксперт по javascript, поэтому я не буду пытаться добавить это здесь, но если вы сделаете это, не стесняйтесь добавлять это к информации здесь

ps 1: не ставьте «www /»в вашем аргументе src.Shiny автоматически заглядывает в папку www..

ps 2: имейте в виду, что некоторые вещи не работают во внутреннем интерфейсе RStudio, и настройте его для запуска блестящих приложений извне, нажав кнопку «Run external» в крошечном меню стрелки, которое находится насправа от кнопки воспроизведения «Запустить приложение».

# 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")
                  )
                )
)

screenshot

...