R Shiny/R Leaflet/ R:使用 R shiny 中的 sliderInput 动态渲染等值线图 2

问题描述 投票:0回答:1

我正在尝试使用滑块功能在 Leaflet 地图上使用 Shiny 选择并仅显示选定的多边形。

下面的代码让滑块做出反应,但我希望色标代表深度,滑块选择和显示能量多边形(删除不相关的多边形)但具有深度色标。多边形文件包含深度和能量数据。

以下问题为我指明了正确的方向。但我无法让它与我的数据一起使用。

在 R shiny 中使用 sliderInput 动态渲染等值线图

Shapefile wave-shp (wave.shp) 如下页:https://www.renewables-atlas.info/downloads/.

这是我的代码:

library(shiny)
library(leaflet)
library(rgdal)
library(sf)
library(dplyr)
library(RColorBrewer)

wave_data <- read_sf("~/path/Wave.shp")

wave_data <- st_transform(wave_data, crs = '+proj=longlat 
+datum=WGS84')

wave_data2 <- wave_data %>% 
mutate_at(vars(An_mn_P_OD), ~ as.integer(round(.x))) 

## Load map

wave_data_map <- leaflet() %>% 
   addProviderTiles(providers$Esri.WorldTopoMap) %>% 
   setView(lng = -4.2026458, lat = 56.4906712, zoom = 5)
wave_data_map

bins <- c(0, 25, 50, 100, 150, 200, 300, 400, 500, 1000, 3100)
pal <- colorBin("RdYlBu", domain = wave_data2$Ave_Depth, bins = 
bins)

## Add polygons

wave_data_map <- leaflet() %>% 
   addProviderTiles(providers$Esri.WorldTopoMap) %>% 
   setView(lng = -4.2026458, lat = 56.4906712, zoom = 5) %>% 
   addPolygons(data = wave_data2, 
           weight = 1,
           smoothFactor = 0.5,
           color = "white", 
           fillOpacity = 0.5, 
           fillColor = pal(wave_data2$Ave_Depth), 
           
)
wave_data_map

## Add legend

wave_data_map <- leaflet() %>% 
   addProviderTiles(providers$Esri.WorldTopoMap) %>% 
   setView(lng = -4.2026458, lat = 56.4906712, zoom = 5) %>% 
   addPolygons(data = wave_data2, 
           weight = 1,
           smoothFactor = 0.5,
           color = "white", 
           fillOpacity = 0.3, 
           fillColor = pal(wave_data2$Ave_Depth)) %>% 
   addLegend(pal = pal, 
         values = wave_data2$Ave_Depth, 
         title = "Average depth",
         labFormat = labelFormat (suffix = "m"),
         opacity = 0.7, 
         position = "bottomright")
wave_data_map


# Define UI for application

ui <- bootstrapPage(
   tags$style(type = "text/css", "html, body 
                {width:100%;height:100%}"),
   leafletOutput("wave_data_map", width = "100%", height = 
                  "100%"),
   sliderInput("wave_data_slider", "Wave energy", 
                         min = 0, max = 75, 
                         value = c(min(wave_data2$An_mn_P_OD), 
                         max(wave_data2$An_mn_P_OD)), 
                         step = 5, 
                         round = 0.5,
                         dragRange = TRUE)
))


# Define server logic

server <- function(input, output, session) {
 wave_energy_output <- reactive ({
    wave_data2 %>% 
    filter(An_mn_P_OD >= input$wave_data_range[1]) %>% 
    filter(An_mn_P_OD <= input$wave_data_range[2]) %>% 
     group_by(Lat)
 })
output$wave_data_map <- renderLeaflet(
  leaflet() %>% 
     addProviderTiles(providers$Esri.WorldTopoMap) %>% 
     setView(lng = -4.2026458, lat = 56.4906712, zoom = 5) %>% 
     addPolygons(data = wave_data2, 
                 weight = 1,
                 smoothFactor = 0.5,
                 color = "white", 
                 fillOpacity = 0.3, 
                 fillColor = pal(wave_data2$Ave_Depth)) %>% 
     addLegend(pal = pal, 
               values = wave_data2$Ave_Depth, 
               title = "Average depth",
               labFormat = labelFormat (suffix = "m"),
               opacity = 0.7, 
               position = "bottomright")
)

observeEvent({input$wave_data_slider}, {
    data = wave_energy_output()[wave_data2$An_mn_P_OD]
  leafletProxy("wave_data_map", data = wave_data2) %>% 
     clearShapes() %>% 
     addPolygons(data = wave_energy_output,
        fillColor = pal, 
        weight = 0.0, 
        opacity = 1, 
        color = "white", 
        dashArray = 3, 
        fillOpacity = 0.7, 
     ) %>% clearControls() %>% 
     addLegend(pal = pal, 
               values = wave_data2$Ave_Depth, 
               title = "Average depth",
               labFormat = labelFormat (suffix = "m"),
               opacity = 0.7, 
               position = "bottomright")
  
}
)}

# Run the application 

shinyApp(ui = ui, server = server)

新错误:

警告:[ 中的错误:不能在末尾对列进行子集化。 ℹ 位置 43、57、57、...、48 和 46 不存在。 ℹ 只有 42 列。

真的很感激任何帮助。

r shiny qgis shinyapps r-leaflet
1个回答
0
投票

工作代码:

library(shiny)
library(leaflet)
library(rgdal)
library(sf)
library(dplyr)
library(RColorBrewer)

wave_data <- read_sf("~/path/Wave.shp")

wave_data <- st_transform(wave_data, crs = '+proj=longlat 
+datum=WGS84')

wave_data2 <- wave_data %>% 
   mutate_at(vars(An_mn_P_OD), ~ as.integer(round(.x))) 

## Load map

wave_data_map <- leaflet() %>% 
   addProviderTiles(providers$Esri.WorldTopoMap) %>% 
   setView(lng = -4.2026458, lat = 56.4906712, zoom = 5)
wave_data_map

bins <- c(0, 25, 50, 100, 150, 200, 300, 400, 500, 1000, 3100)
pal <- colorBin("RdYlBu", domain = wave_data2$Ave_Depth, bins = bins)

# Define UI for application

ui <- bootstrapPage(
   tags$style(type = "text/css", "html, body 
             {width:100%;height:100%}"),
   leafletOutput("wave_data_map", width = "100%", height = 
                "100%"),
   absolutePanel(top = 10, right = 10, 
   sliderInput("wave_data_range", "Wave energy", 
           min = 0, max = 75, 
           value = c(min(wave_data2$An_mn_P_OD), 
                     max(wave_data2$An_mn_P_OD)), 
           step = 5, 
           round = 0.5,
           dragRange = TRUE)
))

# Define server logic

server <- function(input, output, session) {
   wave_energy_output <- reactive({
      data <- wave_data2 %>% 
         filter(An_mn_P_OD >= input$wave_data_range[1],
            An_mn_P_OD <= input$wave_data_range[2])
      data %>% group_by(Lat)
   })

  output$wave_data_map <- renderLeaflet({
   leaflet() %>% 
     addProviderTiles(providers$Esri.WorldTopoMap) %>% 
     setView(lng = -4.2026458, lat = 56.4906712, zoom = 5) %>% 
     addPolygons(data = wave_data2, 
                 weight = 1,
                 smoothFactor = 0.5,
                 color = "white", 
                 fillOpacity = 0.3, 
                 fillColor = pal(wave_data2$Ave_Depth)) %>% 
     addLegend(pal = pal, 
               values = wave_data2$Ave_Depth, 
               title = "Average depth",
               labFormat = labelFormat (suffix = "m"),
               opacity = 0.7, 
               position = "bottomright")
 })

 observeEvent(input$wave_data_range, {
    data <- wave_energy_output()
    leafletProxy("wave_data_map", data = data) %>% 
     clearShapes() %>% 
     addPolygons(data = data,
                 fillColor = pal(wave_energy_output()$Ave_Depth), 
                 weight = 1,
                 smoothFactor = 0.5,
                 color = "white", 
                 fillOpacity = 0.3)
   })

}

# Run the application 

shinyApp(ui = ui, server = server)
© www.soinside.com 2019 - 2024. All rights reserved.