我想对我的数据集进行子集化,只显示其列值不同于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在地图上。
我该怎么做?我已经为此苦苦挣扎了很长时间!
答案 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)