Проблема при перезагрузке анимированного GIF в Chrome - Часть II - PullRequest
0 голосов
/ 28 марта 2019

Продолжая предложение Марка здесь Я сейчас использую uiOutput и renderUI.

Приведенный ниже код отображает анимированный GIF («анион»). Когда кнопка «Снова» нажата, он сбрасывает Chrome с Javascript способами, которые я до конца не понимаю, а затем моделирует мою большую программу, перезаписывая оригинальный анимированный GIF другим анимированным GIF («anitwo»).

Однако «anitwo» не отображается, «anione» отображается. Я могу просмотреть локальный файл и увидеть, что он был написан, и просмотреть его успешно, открыв его в Chrome. Как просмотреть другой файл с тем же именем?

Я понимаю, что я непоследовательно использую «www / tmp / ani.gif» и «tmp / ani.gif» и понимаю, что блестящий поиск файлов в «www». Тем не менее, без этих несоответствий я получаю файл not found ошибки.

ani.gif и ani2.gif здесь .

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)  

1 Ответ

1 голос
/ 28 марта 2019

Разве вы не можете просто сделать

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)  

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...