r - 通过 R Shiny 中的 Leaflet 仅在 slider 上显示选定日期的数据点

标签 r shiny leaflet

我创建了一个 Timeseries 可视化 map 应用程序,它可以随着时间序列动画的进展更新 Leaflet 上的数据点

现在我正在尝试添加另一个功能,当用户从时间序列中选择特定的一周时, map 将仅显示该日期的点。我想到的一种方法是添加使用两个切换来定义范围的功能,因此当用户将开始和结束切换拖动到同一周时, map 将仅显示该周的数据点。或者也许有更好的方法。

如何创建传单,使其不仅像动画一样显示整个时间序列的全部数据点(当前代码执行此操作),而且还能够仅显示所选日期的数据点 slider ?

代码:

# This is a Shiny time series map web application
library(shiny)
library(tidyverse)
library(tidyr)
library(leaflet)
library(xts)


xts_to_tibble <- function(xts_obj) {
  data.frame(index(xts_obj), coredata(xts_obj)) %>%
    set_names(c("date", names(xts_obj))) %>%
    as_tibble()
}

# Create sample data
Date <- c(
  "2014-04-08", "2014-06-04", "2014-04-30",
  "2014-05-30", "2014-05-01"
)
lat <- as.numeric(c(
  "45.53814", "45.51076", "45.43560", "45.54332",
  "45.52234"
))
lon <- as.numeric(c(
  "-73.63672", "-73.61029", "-73.60100",
  "-73.56000 ", "-73.59022"
))
id <- as.numeric(c("1", "2", "3", "4", "5"))

# Create a df from the above columns
df <- data.frame(id, lat, lon, Date)
df$Year <- lubridate::year(df$Date)
df$Month <- lubridate::month(df$Date, label = TRUE, abbr = FALSE)
df$Week <- lubridate::week(df$Date)
df$Date <- as.Date(df$Date)
ui <- fluidPage(

  # Title
  titlePanel("Time Series Visiualization Map"),
  sidebarLayout(

    # Define the sidebar
    sidebarPanel(
      radioButtons(
        inputId = "Frequency",
        label = " Select Timer Series Frequency",
        choices = c(
          "weeks",
          "months",
          "years"
        ),
        selected = "weeks",
        inline = T
      ),
      uiOutput("Time_Series_UI")
    ),
    mainPanel(
      leafletOutput("Time_Series_Map")
    ),
  )
)



# Define server logic required to draw a histogram
server <- function(input, output) {

  # Render slider input depending on data frequency

  observe({
    # Create an xts object
    df_xts <- xts(df, order.by = as.Date(df$Date))

    # All_Dates = unique(df$Start_Date)

    Filtered_Dates <- df_xts[xts::endpoints(
      df_xts,
      on = input$Frequency
    )] %>% xts_to_tibble()

    output$Time_Series_UI <- renderUI({
      sliderInput("Date", "Date:",
        min = pull(slice_min(Filtered_Dates, date), date),
        max = pull(slice_max(Filtered_Dates, date), date),
        value = pull(slice_min(Filtered_Dates, date), date),
        step = 1,
        timeFormat = "%YYYY-%MM-%DD",
        animate = T
      )
    })
  })

  # Filter data for the date selected
  Filtered_Data <- reactive({
    req(input$Date)
    filter(df, Date == input$Date)
  })


  # Create the leaflet map
  output$Time_Series_Map <- renderLeaflet({
    leaflet(df) %>%
      addTiles() %>%
      setView(lat = 0, lng = 0, zoom = 2)
  })

  # Create data markers for selected date
  observe({
    # print(input$Date)

    leafletProxy("Time_Series_Map", data = Filtered_Data()) %>%
      addCircleMarkers(
        lng = ~lon, lat = ~lat,
        popup = ~id
      )
  })
}

# Run the application
shinyApp(ui = ui, server = server)  

最佳答案

我认为在这种情况下答案并不太难,目前您的最后一个观察者如下所示:

  observe({
    # print(input$Date)
    
    leafletProxy("Time_Series_Map", data = Filtered_Data())     %>%
      addCircleMarkers(
        lng = ~lon, lat = ~lat,
        popup = ~id
      )
  })

该观察者每次都会在 Filtered_Data() 中添加标记,但标记永远不会被删除。通过使用一个组并清除该组,您每次都会删除旧标记:

  observe({
    leafletProxy("Time_Series_Map", data = Filtered_Data())     %>%
      clearGroup("points") %>%
      addCircleMarkers(group='points',
        lng = ~lon, lat = ~lat,
        popup = ~id
      )
  })

关于r - 通过 R Shiny 中的 Leaflet 仅在 slider 上显示选定日期的数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70992103/

相关文章:

r - install.packages R 在 Ubuntu 12.04 上下载但不安装包

html - CSS:如何更改 Bootstrap 导航栏背景颜色

r - if语句去掉: Error in if: argument is of length zero

r - 使用 choroplethr 包时修复了 Shiny 中 choropleth 的范围

javascript - ngRepeat + map.invalidateSize() 的 ng Leaflet 指令问题

r -\Sexpr{} 在 .tex 文件中引用 R 对象

r - 如何标记 r 列中两个特定字符值之间的所有行?

javascript - 如何使用 htmlOutput 在 R Shiny 应用程序中启用语法突出显示

javascript - 如何在 Leaflet.draw 中编辑弹出窗口

javascript - 单击 R Leaflet 中的 'plugin' 脉冲标记时添加弹出窗口