如何使用 R Shiny 映射大型数据集?

Posted

技术标签:

【中文标题】如何使用 R Shiny 映射大型数据集?【英文标题】:How to map large datasets with R shiny? 【发布时间】:2020-04-23 15:55:53 【问题描述】:

有没有办法提高使用闪亮应用映射大型数据集的渲染速度/质量?

我们希望使用 shiny 来创建一个显示我们收集的一些数据的位置的应用程序,但是我们发现它可能不可行。我们的完整数据集接近 100 万行,我们发现表格越长,使用地图就越困难。到目前为止,我们一直在使用传单包进行映射,并且我们的日期集作为 .RData 文件导入。寻找关于替代库或编码实践的建议,我可能会危及提高速度和质量。

下面是一个示例,其中包含一些随机样本数据,以显示我们一直面临的问题。

################################################################################################
################################################################################################
# Sec 1a. Needed Libaries & Input Files

# Libaries
library(shiny) # How we create the app.
library(shinycssloaders) # Adds spinner icon to loading outputs.
library(shinydashboard) # The layout used for the ui page.
library(leaflet) # Map making. Leaflet is more supported for shiny.
library(dplyr) # Used to filter data for plots.


FileIn <- data.frame(SiteID = 1:160000  , Longitude = rnorm(160000, mean=-105, sd=4),  Latitude = rnorm(160000, mean=35, sd=4))

################################################################################################
################################################################################################
# Sec 2. The UI (html Page)

ui <- dashboardPage(

  dashboardHeader(
    title ="Sample point data"
  ), #enddashboardHeader

  dashboardSidebar(
  ), #enddashboardSidebar

  dashboardBody(
    tabsetPanel(
      tabPanel("Map", fluidRow(withSpinner(leafletOutput("mapA"))))
    ) #endtabsetPanel
  ) #enddashboardBody

) #end dashboardPage

################################################################################################
################################################################################################
# Sec 3. The Server (function)

server <- function(input, output, session) 


  #### The Map ouput.
  output$mapA <- renderLeaflet(
    leaflet(data = FileIn) %>%
      addTiles("Add Map Title Here") %>%
      addProviderTiles("Esri.WorldImagery") %>%
      addCircleMarkers(
        lng = ~Longitude,
        lat = ~Latitude,
        radius = 1)
  )


 #endServer


################################################################################################
################################################################################################
# Sec 4. Run the application.

shinyApp(ui = ui, server = server)

【问题讨论】:

【参考方案1】:

您介意使用标记聚类吗? clusterOptions = markerClusterOptions()

library(shiny) # How we create the app.
library(shinycssloaders) # Adds spinner icon to loading outputs.
library(shinydashboard) # The layout used for the ui page.
library(leaflet) # Map making. Leaflet is more supported for shiny.
library(dplyr) # Used to filter data for plots.


FileIn <- data.frame(SiteID = 1:160000  , Longitude = rnorm(160000, mean=-105, sd=4),  Latitude = rnorm(160000, mean=35, sd=4))

################################################################################################
################################################################################################
# Sec 2. The UI (HTML Page)

ui <- dashboardPage(

  dashboardHeader(
    title ="Sample point data"
  ), #enddashboardHeader

  dashboardSidebar(
  ), #enddashboardSidebar

  dashboardBody(
    tabsetPanel(
      tabPanel("Map", fluidRow(withSpinner(leafletOutput("mapA"))))
    ) #endtabsetPanel
  ) #enddashboardBody

) #end dashboardPage

################################################################################################
################################################################################################
# Sec 3. The Server (function)

server <- function(input, output, session) 


  #### The Map ouput.
  output$mapA <- renderLeaflet(
    leaflet(data = FileIn) %>%
      addTiles("Add Map Title Here") %>%
      addProviderTiles("Esri.WorldImagery") %>%
      addCircleMarkers(
        lng = ~Longitude,
        lat = ~Latitude,
        radius = 1,
        clusterOptions = markerClusterOptions())
  )


 #endServer


################################################################################################
################################################################################################
# Sec 4. Run the application.

shinyApp(ui = ui, server = server)

【讨论】:

这是我们考虑过的一个选项,它确实有助于减少渲染时间。但是,除非您放大它们不再聚集的点,否则您将失去识别“按颜色类型”的能力。

以上是关于如何使用 R Shiny 映射大型数据集?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 Shiny R 图中的闪烁错误?

R Shiny 如何在根据用户选择从 mysqlDB 检索数据时使用 renderPlot 构建条形图

我们如何将大型数据集从 Google BigQuery 导入 R?

R读取大型数据集内存不足如何解决,如果利用Linux有啥有效方法吗?

R Shiny:如何将数据表添加到动态创建的选项卡

如何从 BigQuery 将大型数据集加载到 R?