Отображение HTML-файла с помощью htmltools ::tags $ iframe в shiny не работает с renderUI()

#html #iframe #shiny

#HTML #iframe #блестящий

Вопрос:

Это мой первый вопрос в StackOverflow. Пожалуйста, простите меня, если вопрос не представлен в надлежащем формате. У меня есть сохраненный HTML-виджет, созданный с помощью flowmapblue.R, который я хочу отобразить в документе Markdown Shiny. Я использую htmltools::tags $ iframe для включения HTML-файла в приложение Shiny. Файл хранится в каталоге www. Для вашей любезной справки я делюсь HTML-файлом по следующей ССЫЛКЕ. Код, который работает и дает желаемый результат, является:

 ---
title: "Flow Map"
author: "xyz"
date: "8/14/2020"
output: html_document
runtime: shiny
---

```{r flowmap, echo=FALSE, message=FALSE, warning=FALSE}
    titlePanel("Mobility Flow Map")
    mainPanel (htmltools::tags$iframe(src ="June_Spain.html", seamless="seamless", height=600, width="100%"))
```
  

Я получаю этот результат без использования renderUI.
Но на самом деле мой документ Markdown Shiny будет адаптивным, где пользователь может выбирать зоны и желаемые месяцы. На основе этих имен будет выбран соответствующий HTML-файл. Вот почему мне нужно использовать следующий фрагмент кода:

 ---
title: "Flow Map"
author: "xyz"
date: "8/14/2020"
output: html_document
runtime: shiny
---

```{r flowmap, echo=FALSE, message=FALSE, warning=FALSE}
    
titlePanel("Mobility Flow Map")
    mainPanel(
                htmlOutput("display_map")
             )
    output$display_map <- renderUI({
        my_test <-  htmltools::tags$iframe(src="June_Spain.html", seamless="seamless", height=600, width="100%")
        my_test
      })
```
  

В этом случае HTML-файл не найден, как показано в результате использования renderUI.
Я проверил несколько похожих проблем с renderUI () и htmlOutput (), но я не мог понять, где что-то идет не так. Мне отчаянно нужна ваша помощь в этом отношении. Заранее спасибо.

Ответ №1:

Странно. В качестве обходного пути вы можете закодировать HTML в строку base64:

 b64 <- base64enc::dataURI(file = "www/June_Spain.html", mime = "text/html")
output$display_map <- renderUI({
  htmltools::tags$iframe(src=b64,  height=600, width="100%")
})
  

Комментарии:

1. Спасибо за ваше предложение. Я провел некоторое тестирование с вашим кодом и определил, что проблема не в функции tags $ iframe. Проблема связана с вызовом jQuery AJAX для конкретных HTML-файлов, которые я использую из flowmapblue.R. Предупреждающее сообщение [Устаревание] Синхронный XMLHttpRequest в главном потоке устарел из-за его пагубных последствий для работы конечного пользователя. Для перекрестной проверки, когда я пробовал мой предыдущий код и ваш код с помощью простого test.html в обоих случаях он отлично работает с тегами $ iframe. Теперь я пытаюсь исправить эту проблему. base64enc — это новое обучение. Спасибо.