addCricleMarkers中的colorFactor错误

时间:2019-03-01 05:56:20

标签: r shiny leaflet r-leaflet

我和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))
  })


}

很抱歉,很长的帖子。到目前为止,我没有尝试过任何方法。我将不胜感激。

0 个答案:

没有答案