2015-10-18 41 views
2

我正在嘗試類似Ramnath的休斯頓犯罪數據熱圖演示,但我遇到了一些問題。也就是說,除了整個熱圖部分外,所有東西似乎都在工作。ShCharts的熱圖

我有一個在西雅圖的犯罪信息的數據集;該數據的一個片段如下:

Offense  Date Longitude Latitude 
3 Assault 2015-10-02 -122.3809 47.66796 
5 Assault 2015-10-03 -122.3269 47.63436 
6 Assault 2015-10-04 -122.3342 47.57665 
7 Weapon 2015-04-12 -122.2984 47.71930 
8 Assault 2015-06-30 -122.3044 47.60616 
9 Burglary 2015-09-04 -122.2754 47.55392 

我試圖創建一個應用程序有光澤,將顯示基於用戶選擇的日期範圍和罪行的一個子集的熱圖。

這裏是我的ui.R:

library(shiny) 
library(rCharts) 
library(rjson) 

shinyUI(fluidPage(
    headerPanel("Crime in Seattle"), 

    sidebarPanel(
    uiOutput("select.date.ran"), 
    uiOutput("select.crime") 
), 

    mainPanel(chartOutput("my.map", "leaflet"), 
      tags$style('.leaflet {height: 500px;}'), 
      tags$head(tags$script(src="http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js")), 
      uiOutput('spd.map')) 
)) 

和server.R:

library(shiny) 
library(rCharts) 
library(rjson) 

spd <- readRDS("data/spd.rds") 

shinyServer(function(input, output, session) { 

    output$select.date.ran <- renderUI({ 
    dateRangeInput("sel.date", "Choose date range:", 
        start = "2014/01/01", end = "2015/10/05", 
        separator = "to", format = "yyyy/mm/dd", 
        startview = "month", weekstart = 0, 
        language = "en") 
    }) 

    output$select.crime <- renderUI({ 
    checkboxGroupInput(inputId = "sel.crime", "Select crimes:", 
        choices = c("Theft", "Fraud", "Drugs/Alcohol", 
           "Weapon", "Assault", "Disturbance", 
           "Robbery", "Homicide", "Prostitution"), 
        selected = "Theft") 
    }) 

    output$my.map <- renderMap({ 

    my.map <- Leaflet$new() 
     my.map$setView(c(47.5982623,-122.3415519) ,12) 
     my.map$tileLayer(provider="Esri.WorldStreetMap") 
    my.map 
    }) 

    output$spd.map <- renderUI({ 
    spd.dat <- spd[spd$Offense %in% input$sel.crime & 
         (spd$Date >= input$sel.date[1] & 
          spd$Date <= input$sel.date[2]), c(3, 4)] 
    spd.json <- toJSONArray2(spd.dat, json = FALSE, names = FALSE) 

    tags$body(tags$script(HTML(sprintf(" 
         <script> 
         var addressPoints = %s 
         var heat = L.heatLayer(addressPoints, {maxZoom: 9, radius: 20, blur: 40}).addTo(map) 
         </script>", rjson::toJSON(spd.json) 
      )))) 
    }) 
}) 

這不是比我在互聯網上找到的例子太多不同,但發生的事情是顯示地圖,並且所有邊欄元素都存在,但不會顯示熱圖。我嘗試在L.heatLayer調用中玩弄半徑和模糊,但沒有任何效果。

我在測試中注意到的一件事情是,JSONArray2需要很長時間來執行,直到它可能會非常昂貴。爲了解決這個問題,我試着將數據集從650,000個觀察點逐漸削減到15,000個左右。這不會改變任何東西。我不確定這是否真的是問題。

任何人都可以幫我指出我的問題背後的問題?提前致謝!

+0

什麼錯誤(如果有的話)顯示在瀏覽器開發人員工具的JavaScript控制檯? – hrbrmstr

+0

有兩個「未捕獲的SyntaxError:意外的令牌<」錯誤,還有一個「無法加載資源:服務器響應的狀態爲404(未找到)」錯誤。還有一個警告,稱「主線程上的同步XMLHttpRequest已被棄用,因爲它對最終用戶的體驗有不利影響。」我不確定這些是什麼意思。 – user4601931

+0

@hrbrmstr我認爲您的評論正在成爲問題的核心......我相信在server.R文件中的HTML(sprintf(...))位中出現問題。它是不是正確地認識到Javascript? – user4601931

回答

2

事實證明,有兩個問題,然後在前兩個問題解決時出現三分之一。

首先,<script>在HTML(sprintf的(...是不必要的這是我認爲是什麼原因導致的「未捕獲的SyntaxError:意外的標記<」。錯誤

一旦我得到了想通了,它似乎是JSON的沒有被視爲由L.heatLayer經/緯度對。我不知道爲什麼這個工作,但改變

spd.dat <- spd[spd$Offense %in% input$sel.crime & 
        (spd$Date >= input$sel.date[1] & 
         spd$Date <= input$sel.date[2]), c(3, 4)] 
spd.json <- toJSONArray2(spd.dat, json = FALSE, names = FALSE) 

spd.dat <- spd[spd$Offense %in% input$sel.crime & 
        (spd$Date >= input$sel.date[1] & 
         spd$Date <= input$sel.date[2]), ] 
spd.arr <- toJSONArray2(spd.dat[c(3,4)], json = FALSE, names = FALSE) 

即,選擇toJSONArray2內部的lat和lon列,解決了這個問題。

最後,一旦出現熱圖,我意識到地圖狀態的每一次變化都會重新繪製現有地圖上的熱圖,直到應用程序在一段時間後凍結。 This答案爲此問題提供瞭解決方案。

+0

您使用的是什麼版本的閃亮? – tospig

+0

我使用的是最新版本,0.12.2。 – user4601931