在Leaflet地图中按colname过滤!=0

问题描述 投票:0回答:2

我想对我的数据集进行子集化,并仅显示其列值不为 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() 根据“Bar”和“School”过滤我的数据,并只绘制值不为 0 的 ID。

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

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

有任何ID可以告诉我该怎么做吗?我已经为此苦苦挣扎了很长时间!!

r shiny r-leaflet
2个回答
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)

0
投票

您需要使用/创建一个基于 input$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
  })
© www.soinside.com 2019 - 2024. All rights reserved.