【问题标题】:R Shiny Leaflet - how to make a CheckboxGroup for binary dataR Shiny Leaflet - 如何为二进制数据制作 CheckboxGroup
【发布时间】:2020-07-12 08:24:48
【问题描述】:

我在这里发布了一个类似的问题: How do I create a Leaflet Proxy in observeEvent() for checkboxGroup in R Shiny 。 但是我有点急切地想要答案,所以我想我会改写我的问题并再次发布。我已经在互联网上搜索了答案,但似乎找不到我要找的东西。为重复发布道歉。

这是我的问题。 我在这里有一个数据集: https://github.com/mallen011/Leaflet_and_Shiny/blob/master/Shiny%20Leaflet%20Map/csv/RE.csv

这是肯塔基州的回收中心。它的设置使每个可回收材料都是一列,每一行(即回收中心)都被列为是/否,以确定每个中心是否实际回收所述材料。 这是数据的示例,以防您无法访问 csv。顶行是标题列。抱歉格式化:

  • 姓名___________________GL______AL_____PL
  • 浴缸社区回收___是_____否____是
  • Ted & Sons Scrap Yard______否______否____是

现在,我在 R 闪亮的仪表板应用程序上使用 Leaflet 将 csv 可视化: https://github.com/mallen011/Leaflet_and_Shiny/blob/master/Shiny%20Leaflet%20Map/re_map.png 但我想添加一个控件,用户可以在其中过滤他们可以回收商品的位置,即,我想在 R shiny 中使用 checkboxGroupInput(),以便用户可以检查材料并让回收中心填充地图。例如,如果有人想知道在哪里回收他们的玻璃,他们可以在复选框组中选中“玻璃”,并弹出所有允许玻璃回收的回收中心。

所以在 R Shiny 中,我已经阅读了我的回收数据 csv (RE.csv):

RE <- read.csv("C:/Users/username/Desktop/GIS/Shiny Leaflet Map/csv/RE.csv")

RE$y <- as.numeric(RE$y)
RE$x <- as.numeric(RE$x)

RE.SP <- SpatialPointsDataFrame(RE[,c(7,8)], RE[,-c(7,8)])

这是我将 checkboxGroupInput() 放在 sidebar() 中的 UI:

ui <- dashboardPage(
  skin = "blue",
  dashboardHeader(titleWidth = 400, title = "Controls"),
  dashboardSidebar(width = 400
                  #here's the checkboxgroup, it calls the columns for glass, aluminum and plastic from the RE.csv, all of which have binary values of yes/no
                  checkboxGroupInput(inputId = "RE_check", 
                                     label = h3("Recycleables"), 
                                      choices = list("Glass" = RE$GL, "Aluminum" = RE$AL, "Plastic" = RE$PL),
                                      selected = 0)
                   ),
  dashboardBody(
    fluidRow(box(width = 12, leafletOutput(outputId = "map"))),
    tags$style(type = "text/css", "#map {height: calc(100vh - 80px) !important;}"),
    leafletOutput("map")
  )
)

现在我遇到的麻烦是:我应该在我的服务器中放入什么以便它观察这些事件中的每一个? 这就是我在用户检查“玻璃”的情况下所拥有的,我不知道它有多么错误或多么正确。我只知道它不起作用。我正在尝试使用“if”语句,因此只有等于“yes”的值才会填充地图。但是目前,无论我做什么,仪表板中的地图都是空白的,尽管复选框组输入似乎有效。

server <- function(session, input, output) {
 observeEvent({
    RE_click <- input$map_marker_click
    if (is.null(RE_click))
      return()

    if(input$RE$GL == "Yes"){
      leafletProxy("map") %>% 
        clearMarkers() %>% 
        addMarkers(data = RE_click,
                   lat = RE$y,
                   lng = RE$x)
      return("map")
    }
  })

这也是我的输出传单地图,以防万一:

 output$map <- renderLeaflet({
    leaflet() %>% 
      setView(lng = -83.5, lat = 37.6, zoom = 8.5)  %>% 
      addProviderTiles("Esri.WorldImagery") %>% 
      addProviderTiles(providers$Stamen.Toner, group = "Toner") %>% 
      addPolygons(data = counties,
                  color = "green",
                  weight = 1,
                  fillOpacity = .1,
                  highlight = highlightOptions(
                    weight = 3,
                    color = "green",
                    fillOpacity = .3)) %>% 
      addMarkers(data = RE,
                 lng = ~x, lat = ~y, 
                 label = lapply(RE$popup, HTML),
                 group = "recycle",
                 clusterOptions = markerClusterOptions(showCoverageOnHover = FALSE)) %>% 
    addLayersControl(baseGroups = c("Esri.WorldImagery", "Toner"),
                     overlayGroups = c("recycle"),
                     options = layersControlOptions(collapsed = FALSE))
  })
}

如果这不明显,我是 R Shiny 的新手。我真的很感激任何和所有的帮助。 我所有的代码都可以在我的 GitHub 上公开下载: https://github.com/mallen011/Leaflet_and_Shiny

谢谢,注意安全!

【问题讨论】:

  • 在这种情况下使用响应式对象可能是值得的。我看了看这个项目,但有很多事情要弄清楚。创建一个新对象filtered_data &lt;- reactive({...]))。在内部,定义数据应遵循的所有条件,然后在渲染传单函数leaflet() %&gt;% addMarkers(data = RE_filtered())... 中使用反应对象。确保您使用()
  • @dcruvolo 谢谢,我试试看!
  • 这可行,但我认为它会触发不必要的地图重新渲染。我认为下面的答案效果最好,因为所有内容都是预渲染的,然后您相应地显示和隐藏图层:rstudio.github.io/leaflet/showhide.html
  • 查看传单文档后还有一些想法。在renderLeaflet 的末尾使用hideGroupshowGroup 定义默认显示/隐藏的层。创建一个单独的 observe 块来评估复选框输入:observe({ if(input$RE_check == "Glass") leafletProxy("map") %&gt;% showGroup("glass") else { leafletProxy("map") %&gt;% hideGroup("glass") } })。确保图层 ID 和输入值匹配。
  • @dcruvolo 谢谢,我一直在研究如何为复选框组制作反应性对象,但是 hideGroup/showGroup 更多地与 layerControl 相关,而不是 Shiny 小部件,对吧?我已经有一个 layerControl 用户可以检查/取消选中图层,我只是想要更多的 UI 交互性与反应性 checkboxGroupInput。您的建议确实有助于为它使用反应性对象,我觉得我几乎让它工作了。非常感谢!

标签: r events checkbox shiny leaflet


【解决方案1】:

也许这会起作用...您可以将不同的回收类型添加为图层,然后在传单地图上添加复选框,而不用担心闪亮的集成。显然,您必须在此处添加其余的回收类型...

library(leaflet)
library(htmlTable)
RE <- read.csv("https://raw.githubusercontent.com/mallen011/Leaflet_and_Shiny/master/Shiny%20Leaflet%20Map/csv/RE.csv")
leaflet() %>% 
  setView(lng = -83.5, lat = 37.6, zoom = 8.5)  %>% 
  addProviderTiles("Esri.WorldImagery") %>% 
  addProviderTiles(providers$Stamen.Toner, group = "Toner") %>% 
  # addPolygons(data = counties,
  #             color = "green",
  #             weight = 1,
  #             fillOpacity = .1,
  #             highlight = highlightOptions(
  #               weight = 3,
  #               color = "green",
  #               fillOpacity = .3)) %>% 
  addMarkers(data = RE[RE$AL=="Yes", ],
             lng = ~x, lat = ~y, 
             #label = lapply(RE$popup, HTML),
             group = "AL",
             clusterOptions = markerClusterOptions(showCoverageOnHover = FALSE)) %>% 
  addMarkers(data = RE[RE$FE=="Yes", ],
             lng = ~x, lat = ~y, 
             #label = lapply(RE$popup, HTML),
             group = "FE",
             clusterOptions = markerClusterOptions(showCoverageOnHover = FALSE)) %>% 
  addMarkers(data = RE[RE$NONFE=="Yes", ],
             lng = ~x, lat = ~y, 
             #label = lapply(RE$popup, HTML),
             group = "NONFE",
             clusterOptions = markerClusterOptions(showCoverageOnHover = FALSE)) %>% 
  addLayersControl(baseGroups = c("Esri.WorldImagery", "Toner"),
                   overlayGroups = c("AL", "FE", "NONFE"),
                   options = layersControlOptions(collapsed = FALSE))

【讨论】:

  • 这是一个有趣的想法,我会尝试一下,看看我是否可以集成到我的代码中。但我仍然希望使用 Shiny 来创建更动态的 UI。非常感谢!我会检查一下,看看我能用它做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多