Ошибка с colorFactor в addCricleMarkers - PullRequest
0 голосов
/ 01 марта 2019

Я новичок в этом, а также Shiny, так что простите меня, если я не достаточно ясен.

Я пытаюсь использовать Shiny и листовку для создания интерактивной карты преступлений с двумя функциями.Во-первых, это возможность использовать ползунок времени, чтобы установить поднабор интервала дат, а во-вторых, пользователь должен ввести определенное количество кластеров, а приложение должно использовать нечеткую кластеризацию fcm для назначения кластеров каждой точке.Точки с очень низкой вероятностью нахождения в любом кластере отбрасываются, так как это больше касается поиска горячих точек, и каждая точка затем наносится на карту в виде circleMarkers.

Полагаю, что все вышеперечисленное я сделал правильно, за исключением окраски кластеров.Я добавлю полный код ниже, но с этим фрагментом из функции сервера: pal <- colorFactor (palette = topo.colors (20), domain = (unique (clusts () $ fuzzy.cluster))) </p>

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


}

Извините за длинный пост.Ничто из того, что я пробовал, до сих пор не сработало.Буду очень признателен за любую помощь.

...