【问题标题】:R shiny leaflet javascript addons - heatmapR闪亮的传单javascript插件 - 热图
【发布时间】:2015-09-03 14:15:18
【问题描述】:

尝试为传单使用其中一个 javascript 插件 - 特别是热图功能 - https://github.com/Leaflet/Leaflet.heat 事情是 - 我想把它合并到 Shiny 中,但是 R 的传单似乎默认没有包含这个插件,所以我必须以某种方式手动包含这个 JS。我最接近弄清楚如何做到这一点的方法是通过 rCharts 上的一篇文章来展示这一点:

server.R.

 HeatMap$addAssets(jshead = c("http://leaflet.github.io/Leaflet.heat/dist/leaflet-heat.js"))
 HeatMap$setTemplate(afterScript = sprintf("<script>
      var addressPoints = %s
      var heat = L.heatLayer(addressPoints).addTo(map)           
      </script>",
      rjson::toJSON(dt)))

(取自:https://github.com/ramnathv/rCharts/issues/498

但是由于对 JS 不太熟悉,而且对传单来说是新手,所以仍然不太清楚如何从头到尾合并它 - 即从 github 获取这个 JS 并最终在数据集 'quakes 上使用传单创建的热图'。

我的服务器端代码如下:

library(leaflet)
output$mymap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles("OpenMapSurfer.Roads",
                       options = providerTileOptions(noWrap = TRUE))
 %>% addMarkers(clusterOptions = markerClusterOptions(), data = quakes))

我想在哪里而不是 clusterOptions 添加地震震级的热图(数据集“地震”包含在 R 中,因此您可以自己查看)。

非常感谢您对解决这个问题的任何帮助! :)

【问题讨论】:

  • Joe Cheng(RStudio 成名)似乎正在研究这个:github.com/jcheng5?tab=repositories(我看的时候它在顶部)。您可能想直接 ping 他。
  • 很好,感谢您的参考!
  • 同时发现了这个简单的方法来实现几乎相同的事情..: (from: link) library(leaflet) pal % addProviderTiles(provider="OpenMapSurfer.Roads") %>% addCircleMarkers(color = ~pal(mag))
  • Heat map in shiny with rCharts 有一个解决方案。我认为您需要取出 &lt;script&gt;&lt;/script&gt; 标签

标签: javascript r shiny leaflet


【解决方案1】:

setTemplate(afterscript...) 位在闪亮状态下不起作用。相反,您需要使用 tags$() 并将热图输出单独渲染到地图。

这是一个使用热图的基本应用程序 (inspired by this SO answer)

server.R

library(shiny)
library(rCharts)

dat <- data.frame(Offence =  c("Assault","Assault","Assault","Weapon","Assault","Burglary"),
                  Date = c("2015-10-02","2015-10-03","2015-10-04","2015-04-12","2015-06-30","2015-09-04"),
                  Longitude = c(-122.3809, -122.3269, -122.3342, -122.2984, -122.3044, -122.2754),
                  Latitude = c(47.66796,47.63436,47.57665,47.71930,47.60616,47.55392),
                  intensity = c(10,20,30,40,50,30000))


shinyServer(function(input, output, session) {

  output$baseMap <- renderMap({
    baseMap <- Leaflet$new() 
    baseMap$setView(c(47.5982623,-122.3415519) ,12) 
    baseMap$tileLayer(provider="Esri.WorldStreetMap")
    baseMap
  })

  output$heatMap <- renderUI({

    ## here I'm creating the JSON through 'paste0()'.
    ## you can also use jsonlite::toJSON or RJSONIO::toJSON

    j <- paste0("[",dat[,"Latitude"], ",", dat[,"Longitude"], ",", dat[,"intensity"], "]", collapse=",")
    j <- paste0("[",j,"]")
    j

    tags$body(tags$script(HTML(sprintf("
                      var addressPoints = %s
                      var heat = L.heatLayer(addressPoints).addTo(map)"
                                       , j
    ))))
  })

})

ui.R

library(shiny)
library(rCharts)

shinyUI(fluidPage(

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

编辑 - 使用 Google 地图

googleway 的开发版本中也有一种方法可以做到这一点。为此,您需要一个有效的 Google API 密钥,目前它只能在浏览器中使用

## devtools::install_github("googleway")
library(googleway)
library(magrittr)
library(shiny)
library(shinydashboard)

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(
    actionButton(inputId = "traffic", label = "traffic"),
    box(width = 10,
        height = 600,
      google_mapOutput("myMap")
    )
  )
)


server <- function(input, output){

map_key <- "your_valid_api_key"
## https://developers.google.com/maps/documentation/javascript/get-api-key

## set up some data-------
pl <- "~s|dF}{~rZnNoExBq@|@SfAIjA@~Et@fBBp@Iv@QxCoArNqGfA_@dB]`KgAfVkC|Gu@rAYf@Q|@i@p@m@n@{@^u@`@kAR_ALiADuACiAIeAOy@_@qA{@uB{@sB]gAUmAOaB?oCTkKr@kZZiN?s@Cq@EQDOLILFn@A\\CpI_A|AQjB[BGPOX@LHz@CpAKT?v@KpHu@vD]LGt@Ix@I\\QBGLOVCPJd@Dj@GnFq@`PaBp@KfBQzA[zAq@nAaAx@aA~ByDp@yAXe@VSVO@EVWPCRDJLBF@Hd@TrDj@rK`ADEJGJ@JFBFrSxBJOPCNHHPdBLnCb@bBb@lAf@zA~@lAbApAzAt@nAxA|C~BhHrAxD~AtEb@|@xAtBpBlBzCbB`AZhIhBrFpA|AZl@HRDLENGXORe@DKJSf@wD`@cDt@}INq@ZuEt@mHfBsN~BkS`CmR\\eDnAiKzAcM`CePNmAhAsGXmArAgFtDsM|DaOh@sC^kCf@kDb@uDl@kI\\sHn@yM?gDEoAOsA[}BUiBUsC@qCNuBViBrCcPp@oGHW|@oPBuDI_DKqAy@wD{Ja^}@oFY_CWoDIqBGqEBsENqE`C{^JuA\\aDj@oDn@cDxAcFz@yBtC{Fp@eAn@_An@s@t@}@j@g@bCaBtCsA`GiAzBm@`C}@jBmA~CiC~DcDjCwAfAa@bBe@nBa@pCYlCArDBlCHhCGnC_@~A]vBk@hAa@lF_CnMaGbDeArD}@vB[zEe@jFS`GFfBFxBJzO\\zZfAfCJdEPbDNvDRnEHvD?tEE~BQhC[zAYnCu@bA]dBm@bIkDtBy@bAYhB[rDYxJ[nB@vAHfBLbCf@|C~@vAp@nCdB|A`A`CzApAr@|Al@rBl@bBZbUbCZBzBDvBEtAMnF_AvB[vBOlCAlBFnBXbDr@~Bv@z@`@bBfAdD~BtB`Bv@f@nAn@x@ZZJ~A\\dBTdADtBEbAGnEg@dFi@`DYdDQdF?|DNfCV`BTlCl@dNvD`HnBdLvClAZn@DzB^hCRd@?fA?|@Ih@O`@Ud@a@h@w@\\u@Pm@Lw@HoBq@qK]eLUcIE{DC{AD}Fn@eSLeCJs@RwFRkDf@sCj@aE`AsFhAuGh@gDt@wEp@}En@_FPeBRkDByBCgBEgAS}B{@oEsA}Dy@eCi@yBGq@?s@Ds@V}@Rg@r@u@ZOj@Ml@Az@PrA^fBb@j@HV@f@e@`B}AbB_B]Ie@KeASiO}CmH_B{L}Bk@QTqBTgCAm@g@kCSaAs@V{CdAmDrAuAh@{@Ra@H{@D{Af@wBt@gAb@]ReBl@"
df_line <- decode_pl(pl)
set.seed(123)
df_line$weight <- runif(nrow(df_line), min = 1, max = 100)

## ------------

## plot the map
output$myMap <- renderGoogle_map({

google_map(key = map_key, data = df_line, search_box = F) %>%
  add_heatmap(weight = "weight") %>%
    add_traffic()

  })

}

shinyApp(ui, server)

【讨论】:

  • 有没有办法用传单包而不是 rCharts 做到这一点?
  • @rrs - 显然它正在路上 - 他们正在处理 this branch/request。我还在我的回答中添加了使用googleway 的谷歌地图版本。
猜你喜欢
  • 2017-11-28
  • 2018-06-19
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多