在 R 中从 Highcharter 加载地图时出现尾随垃圾错误

Getting Trailing Garbage error when loading maps from Highcharter in R

我使用 R 中的 highcharter 包创建了一个包含大量图表的仪表板。我还制作了一些带有突出显示图块的地图。我加载的地图如下:

library(highcharter)

mapdata <- get_data_from_map(download_map_data("custom/world-highres.js"))

这产生了一个数据框,其中包含一些有用的列,可以添加到我的主数据框中。绘图时:

hcmap("custom/world-highres.js", showInLegend = FALSE) %>%
  hc_add_series(
    data = df, 
    type = "mapbubble",
    name = "city", 
    minSize = "1%",
    maxSize = "5%",
    tooltip = list(
      pointFormat = "{point.city}: {point.z:,.0f}"
    ))

但是,从今天开始,我收到以下错误:

hcmap("custom/world-highres.js")
trying URL 'https://code.highcharts.com/mapdata/custom/world-highres.js'
Content type 'text/javascript' length 238592 bytes (233 KB)
downloaded 233 KB

Error: parse error: trailing garbage
          [6810,7337],[6838,7338]]]}}]};
                     (right here) ------^

我不知道那个分号是否被添加了,但它似乎 return 在我的所有地图上都是一个错误。你知道为什么吗?或者,有没有办法将 javascript 加载到 R 并将其转换为数据帧。数据可以在这里找到:

https://code.highcharts.com/mapdata/custom/world-highres.js

好的,所以在查阅地图数据的变更日志后:

我想这就是我不幸的根源。知道可以做什么吗?

您可以尝试从 Highcharts JS API 导入此脚本,然后看看它是否能正常工作。在这里您可以找到一篇解释如何在 R 中使用 JS 的文章:https://www.highcharts.com/blog/tutorials/working-with-highcharts-javascript-syntax-in-r/?fbclid=IwAR1o6Hxeq21KQ3C8TwVXKJjoqs2XBaXy3Ai2j3dK86c6LyQcVEtnX_kVHfA

经过进一步调查,并遵循 post 和维护包的人 @jbkunst 的回答,有一个修复程序需要拉取最新版本的包。

这是代码:

remotes::install_github("jbkunst/highcharter")

可在此处获得更多信息 link:

https://github.com/jbkunst/highcharter/issues/741

编辑: 这不再是事实,当您从 jbkunst 的 github 存储库下载包的更新版本时,该包也适用于 flexdashboard

但是,请注意,对于我的具体问题,它嵌入在 flexdashboard 的制作中,拉出最新版本的包似乎引入了一个错误,第一个情节正确显示,并且以下情节没有。这个错误是不一致的,所以它可能会也可能不会发生在你这边。我已经在包的 github 页面上添加了一个 post,如果您有兴趣,还有一个功能示例:

编辑: 此问题已解决 https://github.com/jbkunst/highcharter/issues/744

为了针对我的具体情况解决这个问题,我提取了最新版本的包,然后将地图数据保存为一个 excel 文件,用于我需要的所有地图。然后我依靠确实有效的 JSON 版本来生成地图: 这是一个图块示例:


library(highcharter)
library(tidyverse)
library(jsonlite)
library(httr)
library(readxl)

de_map_js <- read_excel("your path/map.xlsx") # Opening JS Map from Excel


map_data <- as_tibble(data.frame(name = de_map_js$name,
                                 values = sample(c(50:200), 16, replace = T))) # Creating Fake Data by Region for Germany



de_map <- "https://code.highcharts.com/mapdata/countries/de/de-all.geo.json" %>% #Downloading the German Map as JSON
  GET() %>% 
  content()



highchart(type = "map") %>% 
  hc_title(text = "Title") %>%
  hc_subtitle(text = "Subtitle") %>%
  hc_add_series_map(map = de_map, df = map_data, joinBy = "name", value = "values", # map = JSON map ; df = data.frame with correct region names ; values = your data values
                    dataLabels = list(enabled = TRUE
                                      ,format = "{point.properties.hc-a2}") # Adding region initials on map
  ) %>%
  hc_colorAxis(stops = color_stops(colors = viridisLite::rocket(213, direction = -1,
                                                                begin = 0.2,
                                                                end = 1))) %>%
  hc_mapNavigation(enabled = TRUE)

这里有一个城市泡沫的例子:

library(highcharter)
library(tidyverse)
library(jsonlite)
library(httr)
library(readxl)




df_fake <- data.frame(
  name = c("Cologne"),
  lat = c(50.9375),
  lon = c(6.9603),
  z = c(1)
) # Creating fake tile data

df <- data.frame(
  name = c("Berlin", "Frankfurt", "Munich", "Cologne"),
  lat = c(52.5200, 50.1109, 48.1351, 50.9375),
  lon = c(13.4050, 8.6821, 11.5820, 6.9603),
  z = c(1000, 500, 750, 1250)
) # Creating bubble map series


de_map_json <- "https://code.highcharts.com/mapdata/countries/de/de-all.geo.json" %>% #Downloading the German Map as JSON
  GET() %>% 
  content() 


highchart(type = "map") %>%
  hc_add_series_map(map = de_map_json, df = df_fake, joinBy = "name", value = "z") %>% # The fake data goes into the map generation, with the real map as JSON
  hc_add_series(
    data = df, # Here you can add your data
    type = "mapbubble", # The type of plot
    name = "city", 
    minSize = "1%",
    maxSize = "5%",
    tooltip = list(
      pointFormat = "{point.name}: {point.z:,.0f}"  # Hover options
    )) %>%
  hc_mapNavigation(enabled = TRUE) %>%
  hc_colorAxis(stops = color_stops(colors = viridisLite::turbo(10, begin = 0.4, end = 0.9))) %>%
  hc_title(text = "Title")



这一切都是通过将 JS 映射保存为 excel 从较新版本的包(见上文),删除并重新安装旧版本的包,最后使用 [= 生成映射来实现的60=] 数据而不是 JS.

所有地图都可以在这里找到:

https://code.highcharts.com/mapdata/