Тепловая карта не изменится в зависимости от значений времени в листовке (R)

#r #time #shiny #leaflet #heatmap

Вопрос:

Я планирую создать тепловую карту, которая показывает изменение активности глубины за выбранный период времени на R shiny. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что тепловая карта со временем не меняется. Он продолжает показывать начальный сюжет снова и снова.

Вот набор данных, который я использую. Это из quake набора данных с несколькими изменениями. Я назвал этот набор данных так quakes_mod.csv

 X1     lat   long  depth mag stations    quakes_cat    time
1   -20.42  181.62  562 4.8   41          High Depth    2020-12-04 05:45:32
2   -20.62  181.03  650 4.2   15          High Depth    2020-12-04 05:45:32
3   -26.00  184.10  42  5.4   43          No Depth     2020-12-04 05:45:32
4   -17.97  181.66  626 4.1   19          High Depth    2020-12-04 05:45:32
5   -20.42  181.96  649 4.0   11          High Depth    2020-12-04 05:45:32
6   -19.68  184.31  195 4.0   12          Low Depth     2020-12-04 05:45:32
7   -11.70  166.10  82  4.8   43          No Depth    2020-12-04 05:45:32
8   -28.11  181.93  194 4.4   15          Low Depth 2020-12-04 05:45:32
9   -28.74  181.74  211 4.7   35         Low Depth  2020-12-04 05:45:32
10  -17.47  179.59  622 4.3   19         High Depth 2020-12-01 08:22:42
 

На a glimpse() , quakes_cat является factor типом, в то время как, time находится dttm в Тихоокеанском стандартном времени

Теперь для моего полного кода R shiny Ниже

 library(shiny)
library(xts)
library(leaflet)
library(dplyr)


df<-read_csv('data/quakes_mod.csv')%>%
  mutate(time=as.POSIXct(time))

ui <- bootstrapPage(
  tags$style(type = "text/css", "html, 
             body {width:100%;height:100%}"),
  leafletOutput("basemap", width= "100%", height = "100%"),
  
  absolutePanel(
    sliderInput(
      "timeRange", label = "Choose Time Range:",
      min = as.POSIXct("2020-12-01 00:00:00"),
      max = as.POSIXct("2020-12-31 23:59:59"),
      value = c(as.POSIXct("2020-12-01 00:00:00"), as.POSIXct("2020-12-04 23:59:59")),
      timeFormat = "%Y-%m-%d %H:%M", timezone='PST', ticks = F, animate = T
    ), draggable = TRUE, top = "80%", left = "40%")
  
)


server <- function(input, output, session) {
  #filter the traffic data based on time selected by user
  filtered <- reactive({
    df[df$time>=input$timeRange[1]amp; df$time<=input$timeRange[2],]
  })
  
  #initial static content along with leaflet the way it should be initially
  output$basemap <- renderLeaflet({
    leaflet() %>%
      addProviderTiles(providers$CartoDB.Positron)
  })
  
  #updating the markers real time
  observeEvent(input$timeRange,
               leafletProxy("basemap", data=filtered()) %>%
                 clearHeatmap() %>%
                 addHeatmap(lng=df$long,lat=df$lat,
                            max=3,radius=3,blur=3,intensity=df$quakes_cat,gradient= "OrRd")
  )
}

shinyApp(ui, server)
 

Однако, наблюдая за моей тепловой картой, ничего не изменилось. Значение тепловой карты не изменяется в зависимости от времени, выбранного в скроллере. Он просто прибегает к тепловой карте, которая была первоначально нанесена. Я точно знаю, что некоторые ценности в depth этом были изменены, Может ли кто-нибудь помочь? Спасибо.

Ответ №1:

Вот некоторые изменения, позволяющие отображать точки кода в зависимости от выбранных дат. Он использует результаты filtered() реактивного, а не полного df фрейма данных. Полный фрейм данных отобразит все точки, отфильтрованные будут отображать только те, которые выбраны. Я изменил данные так, чтобы полностью воспроизводимый пример иллюстрировал функционирующий код. Я использовал dput для создания фрейма данных, который всегда лучше, чем вставка текстовой версии данных, так как нет никаких шансов на двусмысленность.

 library(shiny)
library(xts)
library(leaflet)
library(leaflet.extras)
library(dplyr)

df <- structure(
    list(
        X1 = 1:10,
        lat = c(
            -20.42,
            -20.62,
            -26,
            -17.97,-20.42,
            -19.68,
            -11.7,
            -28.11,
            -28.74,
            -17.47
        ),
        long = c(
            181.62,
            181.03,
            184.1,
            181.66,
            181.96,
            184.31,
            166.1,
            181.93,
            181.74,
            179.59
        ),
        depth = c(562L, 650L, 42L, 626L, 649L, 195L, 82L, 194L,
                            211L, 622L),
        mag = c(4.8, 4.2, 5.4, 4.1, 4, 4, 4.8, 4.4, 4.7,
                        4.3),
        stations = c(41L, 15L, 43L, 19L, 11L, 12L, 43L, 15L, 35L,
                                 19L),
        quakes_cat = c(
            "High Depth",
            "High Depth",
            "No Depth",
            "High Depth",
            "High Depth",
            "Low Depth",
            "No Depth",
            "Low Depth",
            "Low Depth",
            "High Depth"
        ),
        time = c(
            "2020-12-01 05:45:32",
            "2020-12-04 05:45:32",
            "2020-12-04 05:45:32",
            "2020-12-06 05:45:32",
            "2020-12-09 05:45:32",
            "2020-12-11 05:45:32",
            "2020-12-15 05:45:32",
            "2020-12-18 05:45:32",
            "2020-12-20 05:45:32",
            "2020-12-30 08:22:42"
        )
    ),
    class = "data.frame",
    row.names = c(NA,-10L)
)

ui <- bootstrapPage(
    tags$style(type = "text/css", "html,
             body {width:100%;height:100%}"),
    leafletOutput("basemap", width = "100%", height = "100%"),
    
    absolutePanel(
        sliderInput(
            "timeRange",
            label = "Choose Time Range:",
            min = as.POSIXct("2020-12-01 00:00:00"),
            max = as.POSIXct("2020-12-31 23:59:59"),
            value = c(
                as.POSIXct("2020-12-01 00:00:00"),
                as.POSIXct("2020-12-04 23:59:59")
            ),
            timeFormat = "%Y-%m-%d %H:%M",
            timezone = 'PST',
            ticks = F,
            animate = T
        ),
        draggable = TRUE,
        top = "80%",
        left = "40%"
    )
)

server <- function(input, output, session) {
    #filter the traffic data based on time selected by user
    filtered <- reactive({
        df[df$time >= input$timeRange[1] amp; df$time <= input$timeRange[2], ]
    })
    
    output$basemap <- renderLeaflet({
        leaflet() %>%
            addProviderTiles(providers$CartoDB.Positron)
    })
    
    observeEvent(
        input$timeRange,
        {                    # do some work in a block and return a leafletProxy
            dff <- filtered()  # get the filtered data frame
            lfp <-             # and use this data to create the map
              leafletProxy("basemap", data = dff) %>%
              clearHeatmap() %>%
              addHeatmap(
                  lng = dff$long,
                  lat = dff$lat,
                  max = 3,
                  radius = 3,
                  blur = 3,
                  intensity = dff$quakes_cat,
                  gradient = "OrRd"
              )
            lfp  # return the leaflet proxy
        }
    )
}

shinyApp(ui, server)
 

Я также добавил library(leaflet.extras) , чтобы код выполнялся.

Комментарии:

1. Я загружаю другой набор данных с большими точками данных. Карта иногда мигает, когда она отображается. Как мне уменьшить или остановить это?

2. Невозможно сказать без данных. Я предлагаю поднять еще один вопрос со всеми подробностями.