我和Shiny都是新手,如果我不太清楚,请原谅我。
我正在尝试使用Shiny和Leaflet创建具有两个功能的交互式犯罪地图。第一种是使用时间滑块来划分要查看的日期间隔的功能,第二种是供用户输入指定数量的聚类,并且应用程序应使用fcm的模糊聚类将聚类分配给每个点。由于存在更多关于发现热点的信息,因此删除了存在于任何聚类中的概率极低的点,然后将每个点作为circleMarkers绘制到地图上。
我相信我已经正确地完成了上述所有操作,除了为群集着色。我将在下面添加完整的代码,但具有服务器功能的以下代码段: pal <-colorFactor(palette = topo.colors(20),domain =(unique(clusts()$ fuzzy.cluster)))
leafletProxy("map") %>%
clearMarkers() %>%
addCircleMarkers(lng = clusts()$TheftLongitude, lat = clusts()$TheftLatitude,
radius = 5, color = ~pal(clusts()$fuzzy.cluster))
我收到错误
警告:UseMethod中的错误:没有适用于“ metaData”的适用方法应用于类“ NULL”的对象。
并且将addCircleMarkers中的颜色选项完全排除在外,该应用程序运行完美,只是每个点都是蓝色。
数据本身来自具有日期,纬度和经度列的csv文件。
完整代码如下:
global.R脚本:
library(ppclust)
library(factoextra)
library(dplyr)
library(fclust)
library(cluster)
library(leaflet)
library(shiny)
library(dplyr)
library(leaflet.extras)
library(RColorBrewer)
df<-read.csv("combined.csv", header = TRUE)
df$TheftLatitude <- as.numeric(df$TheftLatitude)
df$TheftLongitude <- as.numeric(df$TheftLongitude)
df$Theft.Date <- as.character(df$Theft.Date)
df$Theft.Date2 <- as.Date.character(df$Theft.Date ,format = "%d/%m/%Y")
df$Theft.Date <- df$Theft.Date2
ui.R脚本:
ui <- bootstrapPage(
tags$style(type = "text/css", "html, body {width:100%;height:100%}"),
leafletOutput("map", width = "100%", height = "100%"),
absolutePanel(bottom = 10, right = 20, draggable = FALSE,
style="z-index:500;", # legend over my map (map z = 400)
tags$h3("Crime map"),
sliderInput("Theft.Date", "DateRange",
min(df$Theft.Date),
max(df$Theft.Date),
value = range(df$Theft.Date)
)
),
absolutePanel(top = 400, left = 10, draggable = TRUE,
numericInput("Crime.Clusters", "Clusters",
min=2, max=20, step=1, value=2
)
)
)
server.R脚本:
server <- function(input, output, session) {
datadf <- reactive({
df %>% filter(Theft.Date >= input$Theft.Date[1] &
Theft.Date <= input$Theft.Date[2])
})
clusts <- reactive({
if (is.null(input$Crime.Clusters)){
return(NULL)
}
sliced <- datadf()[c('TheftLatitude', 'TheftLongitude')]
fuzzy <- fcm(sliced, centers=input$Crime.Clusters)
df2 = data.frame(datadf()$TheftLatitude, datadf()$TheftLongitude, fuzzy$u[,1:input$Crime.Clusters],
fuzzy$cluster)
colnames(df2)[1:2] <- c('TheftLatitude', 'TheftLongitude')
df2$maxc = apply(df2[,3:(input$Crime.Clusters+2)],1,max)
df3 <-df2[!(df2$maxc<0.6),]
return(df3)
})
output$map <- renderLeaflet({
leaflet(df) %>%
addTiles() %>%
fitBounds(~min(TheftLongitude), ~min(TheftLatitude), ~max(TheftLongitude), ~max(TheftLatitude))
})
observe({
if (is.null(clusts())){
leafletProxy("map") %>%
clearMarkers()
return()
}
pal <- colorFactor(palette = topo.colors(20), domain = (unique(clusts()$fuzzy.cluster)))
leafletProxy("map") %>%
clearMarkers() %>%
addCircleMarkers(lng = clusts()$TheftLongitude, lat = clusts()$TheftLatitude,
radius = 5, color = ~pal(clusts()$fuzzy.cluster))
})
}
很抱歉,很长的帖子。到目前为止,我没有尝试过任何方法。我将不胜感激。