【问题标题】:Change Leaflet Map Dynamically based on Multiple Reactive expressions基于多个反应式表达式动态更改传单地图
【发布时间】:2019-04-03 20:58:51
【问题描述】:

在示例数据框DF 中,我有以下列。

gender <- c("Male", "Female","Female", "Male")
Location <- c("AB", "BC", "CD", "DE")
hasTV <- c("Yes","Yes","No","No")
Latitude <- c(49.82380908513249,59.478568831926395,59.478568831926395,49.82380908513249)
Longitude <- c(-10.8544921875,-10.8544921875,2.021484375,2.021484375)
DF <- data.frame(gender,Location,hasTV,Latitude,Longitude)

在 UI 下,我使用 radiobuttons 从 hasTV 中选择选项,checkboxGroupInput 选择 Gender 并使用 selectInput 创建位置下拉列表。我已经在fluidRow 中实现了这一点,如下所示。

sex <- unique(DF$gender)
loc <- unique(DF$Location)
hastv <- unique(DF$hasTV)

radioButtons("radio_hastv",label = "Has TV", choices = hastv, selected = "Yes")
checkboxGroupInput("checkbox_gender", label = "Gender", choices = sex, selected = sex)
selectInput("Location", label = "Location", choices=loc, selected = "AB")
leafletOutput("mymap", height = 415)

在服务器函数中,我有多个基于所选输入的反应式表达式。这就是我实现表达式的方式。

 filtered_gender <- reactive({
   DF[DF$gender == input$checkbox_gender,]
 })

 filtered_hastv <- reactive({
   DF[DF$hasTV == input$radio_hastv,]
 })

 filtered_loc <- reactive({
   DF[DF$Location == input$loc,]
 })

我已经渲染了传单地图。但是,我希望在以某种方式选择所有这三个输入时更改我的地图。例如如果一个人选择,gender=Male,location=DE 并且 hasTV=No,则在地图上绘制具有正确 gps 的适当地图。

到目前为止,我只能使用一种反应式表达式来更新传单地图,如下所示。

 observe(leafletProxy("mymap", data = filtered_loc()) %>%
           clearMarkers()%>%
           addMarkers(radius =3)%>%
           label = ~htmlEscape(DF$hasTV)
         )  

如何合并其他反应式表达式,以便地图相应地更改。谢谢。

【问题讨论】:

    标签: r shiny shinydashboard reactive r-leaflet


    【解决方案1】:

    您需要将所有这些过滤器移动到一个反应式中并在您的传单图中使用它 -

    library(dplyr)
    
    filtered_data <- reactive({
       DF %>%
         filter(gender %in% input$checkbox_gender,
                hasTV %in% input$radio_hastv,
                Location %in% input$loc
                )
     })
    
     observe(leafletProxy("mymap", data = filtered_data()) %>%
               clearMarkers()%>%
               addMarkers(radius =3)%>%
               label = ~htmlEscape(hasTV) # note change; using DF here is wrong
             )
    

    【讨论】:

    • 我已经实现它并收到此错误,Data contains 7 rows with either missing or invalid lat/lon values and will be ignoredWarning: Error in filter_impl: Result must have length 140, not 0"。经纬度中的 N/A 是否是问题所在?
    • 当我将 genderhasTV 更改为仅单选按钮时,它不会引发此错误。这是checkboxGroupInput 的问题。尤其是当我取消选择这两个选项时。
    • 我已将答案编辑为使用%in% 而不是==。如果您取消选择所有复选框选项,则无需绘制任何内容。还可以尝试删除leafletProxy() 中的label 参数...看看这是否会导致问题。
    • 谢谢!那行得通!我还有一个问题,如何添加一个响应式表达式,根据所选的loc 触发地图的不同缩放级别?
    • 无法在评论中回答这个问题。您需要将其作为一个单独的问题提出,并提供一个针对该问题的可重现的小示例。
    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 2013-12-31
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    相关资源
    最近更新 更多