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