首页 > 解决方案 > R Shiny Leaflet 弹出窗口中的 includeHTML

问题描述

我正在使用 Leaflet 制作一个 R Shiny 应用程序,显示城市中的树木。我想在标记弹出窗口中添加一个 svg 图像,这取决于单击标记的树种,但我无法让 includeHTML 工作。

具有两个标记的最小可重复示例

圈子.svg:

<svg width = "20" height = "20"
  xmlns="http://www.w3.org/2000/svg">
  <circle cx="10" cy="10" r="10" style="fill:#000;"/>
</svg>

正方形.svg:

<svg width = "20" height = "20"
  xmlns="http://www.w3.org/2000/svg">
  <rect x="0" y="0" width = "20" height = "20" style="fill:#000;"/>
</svg>

当我运行下面的代码时,我得到一个错误:

library(shiny)
library(leaflet)
library(tidyverse)
library(magrittr)

df <- data.frame("type" = c("circle", "square"), 
                 "lon" = c(13.36, 13.37), 
                 "lat" = c(52.56, 52.57)
                 )

ui <- fluidPage(

  leafletOutput("map")

)

server <- function(input, output) {

  output$map <- renderLeaflet({
    leaflet(df) %>%
      addTiles() %>%
      addCircleMarkers(
        popup = ~ paste0(type, ": ", includeHTML(paste0(type, ".svg")))
        )
  })

}
shinyApp(ui = ui, server = server)
Warning: Error in file: invalid 'description' argument
  119: file
  118: readLines
  117: includeHTML
...

但如果删除 includeHTML,文件名会正确写入弹出窗口。

popup = ~ paste0(type, ": ", paste0(type, ".svg"))

如果我 index type, includeHTML 工作正常,期望它在两个弹出窗口中都显示圆圈,这当然不是我想要的:

popup = ~ paste0(type, ": ", includeHTML(paste0(type[1], ".svg")))

似乎 includeHTML 采用整个df$type向量,而不仅仅是与标记相关的向量的一个元素。

发生了什么事,我该如何解决?非常感谢您的帮助。

标签: rshinyleafletpopup

解决方案


您可以使用
sapply(type, function(x) paste0(x, ": ", includeHTML(paste0(x, ".svg"))))
如下方式生成弹出窗口:

ui <- fluidPage(
  leafletOutput("map")
)

server <- function(input, output) {
  output$map <- renderLeaflet({
    leaflet(df) %>%
      addTiles() %>%
      addCircleMarkers(
        popup=~sapply(type, function(x) paste0(x, ": ", includeHTML(paste0(x, ".svg"))))
        )
  })
}

shinyApp(ui = ui, server = server)

在此处输入图像描述


推荐阅读