【问题标题】:Filter map using Leaflet and Shiny in R - multiple value attributes在 R 中使用 Leaflet 和 Shiny 过滤映射 - 多值属性
【发布时间】:2016-08-26 14:05:59
【问题描述】:

我正在尝试根据属性过滤地图上的点。只要一个属性只包含一个值,它就可以正常工作。如果一个属性有多个值(即“水;沙子”),我无法根据过滤器映射这一点。

这是我的最小示例:

library(data.table)
mydat <- data.table( londd=c(20, 38, 96, 32),
                     latdd=c(60, 56, 30, 31),
                     art=c("mountain", "water,sand", "sand", "forest"),
                     anwendung=c("a","b","c","d"))

#Set up ui
ui <- shinyUI(fluidPage(
sidebarPanel(h5("", width=2),
     checkboxGroupInput(inputId="ArtFlag", label=h4("Art des Bodens"), 
        choices=setNames(object=c("mountain", "water", "sand", "forest"),
                           nm=c("mountain", "water", "sand", "forest"))),
     checkboxGroupInput(inputId="AnwendungFlag", label=h4("Anwendung"), 
        choices=setNames(object=c("a","b","c","d"),
                           nm=c("a","b","c","d"))),
position="left"),
#App mainPanel content and styles
mainPanel(fluidRow(leafletOutput(outputId="lmap")))
              )
            )
          )

#Set up server
server <- function(input, output){
#Build leaflet map
lmap <- leaflet(data=mydat)%>%
addProviderTiles("Stamen.TonerLite", options = providerTileOptions(noWrap = TRUE)) %>%
fitBounds(~min(londd), ~min(latdd), ~max(londd), ~max(latdd))

#Filter data
datFilt <- reactive(mydat[art%in%input$ArtFlag & anwendung%in%input$AnwendungFlag])

#Add markers based on selected flags
observe({
  if(nrow(datFilt())==0) {print("Nothing selected");leafletProxy("lmap") %>% clearShapes()}
    else{ #print(paste0("Selected: ", unique(input$InFlags & input$InFlags2)))
  
    leafletProxy("lmap", data=datFilt())%>%clearShapes()%>%
    addCircleMarkers(lng=~londd, lat=~latdd,
                     clusterOptions=markerClusterOptions(), weight=3,
                     color="#33CC33", opacity=1, fillColor="#FF9900", 
                     fillOpacity=0.8)%>% clearShapes()
        }
     })

   output$lmap <- renderLeaflet(lmap)
}

#Run app
shinyApp(ui = ui, server = server)

如果我的编码格式不正确,我很抱歉。我还是个初学者。

非常感谢,

克里斯蒂娜

【问题讨论】:

    标签: r shiny leaflet


    【解决方案1】:

    好吧,我不能 100% 确定这能解决您的问题,所以如果没有,请发表评论。您的问题出在reactive 语句中 - 您没有“水,沙”复选框,因此您永远无法匹配复选框 B。无论是水还是沙子,都无法匹配复选框 B选择后,我尝试了这个,使用grepl 来获得模式匹配,而不是完全匹配。尝试将您的 datFilt 呼叫更改为:

      #Filter data
      datFilt <- reactive({
    
        filterName <- ifelse(length(input$ArtFlag) == 0, 'none', input$ArtFlag)
    
        mydat[grepl(filterName, art) & anwendung%in%input$AnwendungFlag]
        })
    

    (这可能不是执行此操作的最有效代码,但希望它能够工作或让您更接近您正在寻找的内容。在完美的世界中,如果结构您的数据不同,但不确定这是否适合您)

    【讨论】:

    • 嗨,Sam,这正是我要找的。非常感谢!
    • @ChMoe 如果这是对您问题的适当答案,您应该接受它。
    【解决方案2】:

    Sam 的回答不正确 - 您无法在 grepl 中比较两个这样的向量

    您需要连接和过滤:

    datFilt <- reactive({
        ArtSearch <- paste0(input$ArtFlag,collapse = "|")
        ArtSearch <- gsub(",","|",ArtSearch)
        mydat[grepl(ArtSearch,art) & Anwendung %in% input$AnwendungFlag]
      }) 
    

    【讨论】:

      猜你喜欢
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 2019-07-16
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多