严格来说,这不是关于Javascript的问题,但我认为这是问题的根源。我在西雅图有一个犯罪数据数据集
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
我正在尝试使用rCharts在Shiny中制作热图,类似于Ramnath的休斯顿犯罪数据热图演示,该演示将采用用户选择的日期范围和攻击子集,并在Leaflet地图上绘制热图。
我有以下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="leaflet-heat.js")),
uiOutput('spd.map'))
))
其中leaflet-heat.js位于Shiny app目录的www文件夹中(我已经尝试过设置src =“http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js”并在标签$脚本中添加一个type =“text / javascript”,但我得到了下面描述的相同错误)。这是我的服务器.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).addTo(map)
</script>", rjson::toJSON(spd.json)
))))
})
})
运行应用程序将显示正确显示地图和侧边栏元素,但不显示热图。如果我在浏览器中运行它并检查开发人员工具Javascript控制台的输出,我会看到两个“Uncaught SyntaxError:Unexpected token&lt;”错误。
长话短说:这些错误意味着什么,我该如何解决?我相信这个问题归结为这个问题,但如果没有,还有其他原因导致热图可能无法显示吗?
编辑:从HTML中删除<script>
(sprintf(...错误更改为“Uncaught TypeError:无法读取未定义的属性'lat'。是我的第一个错误{{1}的原因不应该在那里?并且是新的错误的原因是L.heatLayer没有正确地读取json作为纬度/经度坐标?
答案 0 :(得分:0)
事实证明,有两个问题,然后在前两个问题得到解决时出现了第三个问题。
首先,HTML中的<script>
(sprintf(...是不必要的。这就是我认为导致“未捕获的SyntaxError:意外的令牌&lt;”错误。
一旦我弄明白,似乎json没有被L.heatLayer视为lat / lon对。我不知道为什么会这样,但改变
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)
即,选择tJSONArray2中的lat和lon列,修复此问题。
最后,一旦热图出现,我意识到地图状态的每次变化都会将热图重新绘制在现有热图之上,以至于应用程序会在一段时间后冻结。 This回答提供了此问题的解决方案。