我想对我的数据集进行子集化,并仅显示其列值不为 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可以告诉我该怎么做吗?我已经为此苦苦挣扎了很长时间!!
一种方法是用 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)
您需要使用/创建一个基于 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
})