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