按名称在传单地图中过滤!= 0

时间:2018-07-07 16:52:09

标签: r shiny leaflet subset

我想对我的数据集进行子集化,只显示其列值不同于0的行。

这是一个非常类似于我的假数据集:

library(dplyr)
library(tidyr)
library(leaflet)
library(data.table)

ID<-c("1","10","15")
Bar<-c("2","5","0")
School<-c("3","0","2")
lat<- c(40.43008, 40.42424, 40.43375)
lon<-c(-3.803114,-3.689486,-3.733934)
Results<-data.frame(ID,Bar,School,lat,lon)

可以理解,有3个ID(1、10、5)。

这是我为一个闪亮的应用程序制作的传单地图的模拟:

ui <- fluidPage(
  mainPanel(
    tabsetPanel(
      tabPanel("Map",leafletOutput("map"))
    ),
    checkboxGroupInput(
      inputId = "profile_input",
      label="Choose a Profile of People",
      choices = c("Bar","School")
    )))
server <- function(input, output, session) {
  output$map<-renderLeaflet({
    map<-  leaflet(Results)
    map<- addTiles(map=map)
    map<- addCircleMarkers(map=map, lng=~lon,lat=~lat,data=Results)

    map
  })
}

shinyApp(ui, server)

我需要的是checkboxgroupinput()以根据“酒吧”和“学校”过滤我的数据,并仅绘制ID值不同于0的ID。

例如,如果我选择选项“ Bar”:

ID“ 15”的“ Bar”值为“ 0”,那么我不想绘制ID 15。但是ID“ 1”和“ 10”的值不同于0,所以我希望这2个ID在地图上。

我该怎么做?我已经为此苦苦挣扎了很长时间!

2 个答案:

答案 0 :(得分:0)

您需要使用/创建基于输入$ profile_input的反应性数据框架,您可以将其“馈送”到传单中。

因此,在服务器部分:

filteredData <- reactive({  
    Results[ !Results[ ,input$profile_input] == 0, ]
  })

然后稍后:

output$map<-renderLeaflet({
    map<-  leaflet(filteredData())
    map<- addTiles(map=map)
    map<- addCircleMarkers(map=map, lng=~lon,lat=~lat,data=filteredData())

    map
  })

答案 1 :(得分:0)

一种方法是用NA替换0值。这将使您受益于为处理此特定问题(以及其他类似情况)下的NA而编写的函数。下面是一个可行的解决方案:

# import required packages 
library(shiny) 
library(leaflet) 
library(dplyr)

# construct the dummy data frame 
Results <- data_frame(   
  ID = c("1","10","15"),   
  Bar = c("2","5","0"),   
  School = c("3","0","2"),   
  lat =  c(40.43008, 40.42424, 40.43375),   
  lon = c(-3.803114,-3.689486,-3.733934) 
)

# replace 0 values with NAs in order to use na.omit() 
Results[Results == 0] <- NA

ui <- fluidPage(

  mainPanel(

    tabsetPanel(
      tabPanel(
        "Map",
        leafletOutput("map")
      )
    ),

    checkboxGroupInput(
      inputId = "profile_input",
      label="Choose a Profile of People",
      choices = c("Bar","School")
    )

  )  

)

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

  clean_data <- reactive({
    # store the needed column names based on user input
    var <- c("ID", input$profile_input, "lon", "lat")
    # filter the data frame and omit rows that include NAs
    na.omit(Results[var])   
  })

  # insert the reactive output of clean_data() where needed below   
  output$map<-renderLeaflet({
    map <-  leaflet(clean_data())
    map <- addTiles(map = map)
    map <- addCircleMarkers(
    map = map, 
      lng = ~lon,
      lat = ~lat,
      data = clean_data()
    )
    map   
  })    

}

shinyApp(ui = ui, server = server)