最有效的方法来控制小册子地图上的点过滤闪亮

时间:2016-01-15 17:03:52

标签: r shiny leaflet

我正在开发一个具有shiny地图的leaflet应用。地图的源数据集包括纬度,经度和其他几个变量。我正在为用户提供应用程序单选按钮,滑块,复选框等与这些其他变量相关的效果,以控制哪些点出现在地图上。

我在下面列出了我的代码的基本示例。我目前正在将我的数据集预分割成子集,然后可以通过反应式表达式(基于用户选择的内容)调用leaflet。这只是一个只有4个子集的简单示例,因此在这里看起来可能并不坏。但是,在我的实际使用案例中,应用程序用户可以选择的过滤器的潜在组合将会更多。

建议在Global.R脚本中创建可能被过滤的所有潜在子数据集吗?或者应该在反应式表达中动态进行过滤?

此外,还有一种替代方法可以使用巨大的嵌套ifelse表达式(比如我下面的相对较小的表达式)吗?当我向我的实际应用添加更多用户过滤选项时,这已经失去控制。我不完全理解反应表达式的更新顺序,它可能取决于多个输入。

如果我与所有过滤排列共享一段巨大的代码,我的问题的动机可能会更清楚,但是想先提供一个更简单的例子:

    library(shiny)
    library(leaflet)
    library(dplyr)

    # Generating dummy data for demonstration
    member <- 1:10
    lat <- c(39.8, 39.6, 39.7, 39.78, 39.82, 39.74, 39.72, 38.9, 37.43, 38.0)
    lon <- c(-86.1, -86.2, -86.3,-86.4,-86.5,-86.6,-86.7,-86.8,-86.9, -87)
    group <- c("a","a","a","b","b","a","a","a","b","b")
    year <- c(1,0,0,1,0,1,0,0,1,0)
    data <- data.frame(member, lat, lon, group, year)

    # Creating data subsets for plotting
    groupA_y1 <- data %>% filter(group == "a", year == 1)
    groupA_y0 <- data %>% filter(group=="a", year == 0)
    groupB_y1 <- data %>% filter(group=="b", year == 1)
    groupB_y0<-data %>% filter(group=="b", year == 0)


    ui <- fluidPage(
      leafletOutput("mymap"),
      radioButtons("group", "Group:", c("A", "B"), selected = "A"),
      radioButtons("year", "Year", c(1,0), selected = 1)
    )



    server <- function(input, output, session) {

       output$mymap <- renderLeaflet({
         leaflet() %>%
         addProviderTiles("CartoDB.Positron", 
                           options = providerTileOptions(noWrap = TRUE)) %>%
          setView(lng = -85.00, lat = 39.00, zoom = 6)
       })


   zerg <-reactive({
     test<-ifelse(input$group=="A" & input$year==1, return(groupA_y1),
            ifelse(input$group=="A" & input$year==0, return(groupA_y0),
                   ifelse(input$group=="B" & input$year==1, return(groupB_y1),
                          return(groupB_y0))))
     return(test)
   })



  observe({
    dataset<- zerg()

    leafletProxy("mymap", data = dataset) %>%
      clearMarkers() %>%
      addCircleMarkers(~lon, ~lat, layerId=~member,
                       stroke=FALSE, fillOpacity=0.9, fillColor="Red") 

  })
}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:1)

对于过滤,我想这取决于每次过滤实际花费的时间。如果它只需要几秒钟,那么用户可能会等待。如果需要20秒并且每次更改参数都需要等待,那么最好在开始时进行过滤,这样您可以在一分钟左右的时候进行加载。

对于ifelse,您可以使用dataframe直接获取所需的数据集。例如,使用您发布的代码,您可以在全局部分中执行:

chooseDataset <- data.frame(group=rep(c("a","b"),each=2),year=rep(c(1,0),2))
chooseDataset$dataset <- paste0("group",toupper(chooseDataset$group),"_y",chooseDataset$year)

以及observe所在的leafletProxy

dataset<- with(chooseDataset,chooseDataset[group==input$group & year=input$year,"dataset"])