使用 Shiny R 将反应性弹出图/图添加到 Leaflet 地图

2024-01-29

我已经构建了一个闪亮的仪表板。用户可以从下拉菜单中选择一个城市,然后下载该城市的一系列数据并使用 Leaflet 进行可视化。 主要的用户需求是单击地图上的某个区域会生成一个弹出图表,其中包含该区域的所有分数(见下图)

这是我的一般方法:

  1. 将用户单击的区域名称存储为反应值
  2. 在生成 ggplot 图表的函数中使用无功值
  3. 使用 leafpop 包中的 addPopupGraphs 函数将 ggplot 图形添加到弹出窗口

这不应该那么难,但我已经被困了好几天了。我还尝试生成一个图表列表(该市的每个区域一个),因为我相信这就是 leafpop 的工作原理。然而,再次走向成功。有人能解决我的挣扎吗?

可重现的例子:

library(sf)
library(dplyr)
library(shiny)
library(shinydashboard)
library(leaflet)
library(leafpop)
library(ggplot2)
library(reshape2)

# Let's use this municipality in the example
inputMunicipality = "Landgraaf"

# Download municipality geometry
df <-st_read(URLencode(sprintf("https://geo.leefbaarometer.nl/leefbaarometer/wfs?version=1.0.0&cql_filter=gemeente=%s%s%s&request=GetFeature&typeName=leefbaarometer:wijken_2018&srsName=epsg:4326&outputFormat=json",
                                               "'", inputMunicipality, "'")))[c("WK_NAAM", "WK_CODE")]
# Add some fake scores
df$environmentScore <- sample(10, size = nrow(df), replace = TRUE)
df$facilitiesScore <- sample(10, size = nrow(df), replace = TRUE)
df$housingScore <- sample(10, size = nrow(df), replace = TRUE)
df$safetyScore <- sample(10, size = nrow(df), replace = TRUE)


# Define dashboard UI 
ui <- dashboardPage(
  dashboardHeader(title = "Testing reactive popup on click event!"),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(leafletOutput("myMap")
             )
    )
  )


# Define server logic 
server <- function(input, output) {
  
  # When a person clicks the map, the name of the clicked area is saved in this reactive value
  clickValue <- reactiveValues(areaName=NULL)
  # I then want to use the reactive "clickValue$areaName" in this function to generate a reactive ggplot
  # The reactive ggplot should then be shown as a popup with the addPopupGraphs function
  reactivePopup <- reactive ({
    makePopupPlot(clickValue$areaName, df)
    })
  
  output$myMap <- renderLeaflet({
    leaflet() %>% 
      addProviderTiles(providers$nlmaps.grijs) %>%
      addPolygons(data = df, weight = 1, fillOpacity = 0.3,
                  group = "test", layerId = ~WK_CODE, popup = df$WK_NAAM) %>%
      addPopupGraphs(list(nonReactiveExamplePopup), group = "test", width = 500, height = 200) 
  })
  
  
  # Save the name of a clicked area in a reactive variable
  observeEvent(input$map_shape_click, { 
    event <- input$map_shape_click
    clickAreaName <- df$WK_NAAM[df$WK_CODE == event$id]
    clickValue$areaName <- clickAreaName

  })
}

  
# Run the application 
shinyApp(ui = ui, server = server)


# Function for generation a popup based on the area clicked by the user
makePopupPlot <- function (clickedArea, df) {
  # prepare the df for ggplot
  noGeom <- st_drop_geometry(df)
  plotData <- noGeom[c("WK_NAAM", "environmentScore", "facilitiesScore","housingScore", "safetyScore")]
  plotDataSubset <- subset(plotData, plotData['WK_NAAM'] == clickedArea) 
  plotDataMelt = melt(plotDataSubset, id.vars = "WK_NAAM")
  
  popupPlot <- ggplot(data = plotDataMelt,  aes(x = variable, y = value, fill=value)) + 
    geom_bar(position="stack", stat="identity", width = 0.9) +
    scale_fill_steps2(
      low = "#ff0000",
      mid = "#fff2cc",
      high = "#70ad47",
      midpoint = 5) +
    coord_flip() +
    ggtitle(paste0("Score overview in ", clickedArea)) + 
    theme(legend.position = "none")

  return (popupPlot)
}

# Add this graph to addPopupGraphs(list() to see how I want it to work
nonReactiveExamplePopup <- makePopupPlot("Wijk 00 Schaesberg", df)

如果我理解正确的话:

library(sf)
library(dplyr)
library(shiny)
library(shinydashboard)
library(leaflet)
library(leafpop)
library(ggplot2)
library(reshape2)


set.seed(1)

# Let's use this municipality in the example
inputMunicipality = "Landgraaf"

# Download municipality geometry
df <-st_read(URLencode(sprintf("https://geo.leefbaarometer.nl/leefbaarometer/wfs?version=1.0.0&cql_filter=gemeente=%s%s%s&request=GetFeature&typeName=leefbaarometer:wijken_2018&srsName=epsg:4326&outputFormat=json",
                               "'", inputMunicipality, "'")))[c("WK_NAAM", "WK_CODE")]
# Add some fake scores
df$environmentScore <- sample(10, size = nrow(df), replace = TRUE)
df$facilitiesScore <- sample(10, size = nrow(df), replace = TRUE)
df$housingScore <- sample(10, size = nrow(df), replace = TRUE)
df$safetyScore <- sample(10, size = nrow(df), replace = TRUE)


# Define dashboard UI 
ui <- dashboardPage(
  dashboardHeader(title = "Testing reactive popup on click event!"),
  dashboardSidebar(),
  dashboardBody(
    fluidRow(leafletOutput("myMap")
    )
  )
)


# Define server logic 
server <- function(input, output) {
  
  # Function for generation a popup based on the area clicked by the user
  makePopupPlot <- function (clickedArea, df) {
    # prepare the df for ggplot
    noGeom <- st_drop_geometry(df)
    plotData <- noGeom[c("WK_NAAM", "environmentScore", "facilitiesScore","housingScore", "safetyScore")]
    plotDataSubset <- subset(plotData, plotData['WK_NAAM'] == clickedArea) 
    plotDataMelt = melt(plotDataSubset, id.vars = "WK_NAAM")
    
    popupPlot <- ggplot(data = plotDataMelt,  aes(x = variable, y = value, fill=value)) + 
      geom_bar(position="stack", stat="identity", width = 0.9) +
      scale_fill_steps2(
        low = "#ff0000",
        mid = "#fff2cc",
        high = "#70ad47",
        midpoint = 5) +
      coord_flip() +
      ggtitle(paste0("Score overview in ", clickedArea)) + 
      theme(legend.position = "none") +
      theme(plot.margin = unit(c(0,0.5,0,0), "cm"), plot.title = element_text(size = 10))
    
    return (popupPlot)
  }
  
  # chart list
  p <- as.list(NULL)
  p <- lapply(1:nrow(df), function(i) {
    p[[i]] <- makePopupPlot(df$WK_NAAM[i], df)
  })
  
  output$myMap <- renderLeaflet({
    leaflet() %>% 
      addProviderTiles(providers$nlmaps.grijs) %>%
      addPolygons(data = df, popup = popupGraph(p, type = "svg")) 
  })
}


# Run the application 
shinyApp(ui = ui, server = server)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Shiny R 将反应性弹出图/图添加到 Leaflet 地图 的相关文章

  • 无法更新/编辑从 R 中的包(`gratia`)导出的 ggplot2 对象

    我希望我在这里遗漏了一些令人痛苦的明显的东西 我希望更新 例如 修复标题 实验室等 由 生成的 ggplot 对象gratia draw 不太确定为什么我无法更新该对象 有一个简单的解决方案吗 devtools install github
  • randomForest 包在删除一个预测类时的奇怪行为

    我正在运行一个随机森林模型 它产生的结果从统计角度来看对我来说完全没有意义 因此我确信有些东西mustrandomForest 包的代码出现错误 至少在模型的本次迭代中 预测 左侧变量是具有 3 种可能结果的政党 ID 民主党 独立党 共和
  • 从 n,k 维矩阵数组中减去 n,k 维矩阵

    如果我有一个数组A A lt array 0 c 4 3 5 for i in 1 5 set seed i A i lt matrix rnorm 12 4 3 如果我有矩阵 B set seed 6 B lt matrix rnorm
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • Quantmod 的简单功能不再起作用

    我明天要交论文 我收到了一条关于 quantmod 的非常奇怪的错误消息 这是我在过去几周使用这个包时从未遇到过的 我无法导入特定于道琼斯指数 DJI 的数据 我收到以下错误消息 getSymbols DJI src yahoo from
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • 如何按时间间隔匹配数据帧?

    这是我从数据记录器导入原始数据时经常出现的问题 温度记录仪设置为每十分钟记录一次温度 单独的气体记录仪设置为记录最后十分钟间隔内使用的气体 我想将这两个记录器的数据合并到一个数据框中进行绘图和分析 但时间并不完全一致 我希望每十分钟的时间段
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI
  • 绘制 Cox 回归的 Kaplan-Meier 图

    我使用 R 中的以下代码设置了一个 Cox 比例风险模型来预测死亡率 添加协变量 A B 和 C 只是为了避免混淆 即年龄 性别 种族 但我们真正对预测变量 X 感兴趣 X 是一个连续变量 cox model lt coxph Surv t
  • 如何在 R 中的 for 循环内将值存储在向量中

    我正在开始使用 R 但我对以下问题感到非常沮丧 我试图将 for 循环内完成的某些计算的值存储到我之前定义的向量中 问题是如何进行索引 因为for循环迭代代码的次数取决于用户的输入 所以变量i不一定要从1开始 它可以从80开始 for举个例
  • `dplyr::_join` 函数的命名向量“by”参数[重复]

    这个问题在这里已经有答案了 我正在写一个函数dplyr join两个数据框by不同的列 第一个数据帧的列名称动态指定为函数参数 我相信我需要使用rlang准引用 元编程 但未能找到可行的解决方案 我很感激任何建议 library dplyr
  • R Shiny:如何将无功值从闪亮模块返回到主服务器功能?

    我有一个简单的玩具示例 它使用 add removeBtn 模块在 第一个 模块中添加和删除 UI 我需要跟踪单击 添加 删除 的次数 如果我不使用模块 这很容易 但我试图在嵌套模块的上下文中执行此操作 代码如下 但基本上 我似乎无法访问主
  • 如何按定义的顺序将图像合并到一个文件中

    我有大约 100 张图像 png 我不想手动执行此操作 而是希望将它们按照定义的顺序 基于文件名 并排放置在一个 pdf 中 每行 12 个图像 有人有什么建议吗 我按照下面托马斯告诉我的方法尝试了 它把它们贴在旁边有一个黑边 我怎样才能去
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • R在Windows平台Rstudio上打印data.frames中的UTF-8代码

    当数据框中存在UTF 8字符时 将无法正常显示 例如 以下内容是正确的 gt U6731 1 朱 但是当我将其放入数据框中并打印出来时 它是 gt data frame x U6731 x 1
  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • R:按组,测试一个变量的每个值是否存在于另一个变量中

    我有一个数据框架 结构如下 a lt c 1 1 1 2 2 2 3 3 3 3 4 4 b lt c 1 2 3 1 2 3 1 2 3 4 1 2 c lt c NA NA 2 NA 1 1 NA NA 1 1 NA NA df lt
  • 如何为自定义 S3 类实现提取/取子集 ([ [<-, [[ [[<-)] 函数?

    我有一个自定义的 S3 类foo 它在正常的基础上添加了一些自定义行为data frame foo object lt data frame class foo object lt c foo data frame 对于这个类 还应该有一个
  • ggplot:如何限制条形图中的输出,以便仅显示最频繁出现的情况?

    我几个小时以来一直在寻找这个简单的东西 但没有结果 我有一个数据框 其中一列为变量 国家 地区 我想要两件事以下 绘制最常见的国家 地区 最常见的位于顶部 找到部分解决方案EDIT找到完整的解决方案 gt gt 重点问题是根据频率限制条形图

随机推荐