Receiving error "Uncaught SyntaxError: Unexpected token <" with Shiny and rCharts

Receiving error "Uncaught SyntaxError: Unexpected token <" with Shiny and rCharts

严格来说,这不是关于 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'))
))

where leaflet-heat.js 在 Shiny app 目录的 www 文件夹中(我已经尝试设置 src="http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js" 并在 tags$script 中添加 type="text/javascript"但我得到了下面描述的相同错误)。这是我的 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).addTo(map)
                      </script>", rjson::toJSON(spd.json)
              ))))
  })
})

运行 应用程序将显示地图和侧边栏元素已正确显示,但未显示热图。如果我在浏览器中 运行 它并检查开发人员工具 Javascript 控制台的输出,我会看到两个 "Uncaught SyntaxError: Unexpected token <" 错误。

长话短说:这些错误是什么意思,我该如何解决它们?我相信问题归结为这一点,但如果不是,是否还有其他原因导致热图可能无法显示?

编辑:通过从 HTML(sprintf(...不在那里?L.heatLayer 没有正确读取 json 作为 lat/long 坐标的新错误的原因是什么?

事实证明,有两个问题,前两个问题解决后又出现了第三个问题。

首先,HTML(sprintf(... 中的 <script> 是不必要的。我认为这是导致 "Uncaught SyntaxError: Unexpected token <" 错误的原因。

一旦我明白了这一点,似乎 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 内的纬度和经度列,解决了这个问题。

最后,一旦热图出现,我意识到地图状态的每一次变化都会在现有热图之上重新绘制热图,以至于应用程序会在一段时间后冻结。 This 答案提供了此问题的解决方案。