在 R leaflet setview 中使用来自 selectinput 的动态值

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

我正在创建一张闪亮的传单地图来记录我去过的地方。我有一个包含坐标和时间的数据集。在我闪亮的应用程序中,我有 2 个小部件 - 一个用于时间线的滑块,一个用于显示我当前去过的国家/地区的下拉框。下拉框中的国家/地区选择基于时间线滑块。举例来说:2016年之前地图上的所有坐标都在A国,那么在下拉框中将只有一个选项(A国)。 2016年1月1日之后,我的国家数量增加到2个,那么下拉框中就会有2个选项(国家A和国家B),目前这个功能运行良好。

现在我想进一步开发我的闪亮应用程序,我想要的功能是当我在下拉框中有多个国家时,应用程序应该允许我选择其中一个国家,并且当选择国家时,传单地图将集中在我选择的国家。我认为在

setview()
中使用 if else 应该可以解决问题。

然后我在下面创建了一个(部分)可行的闪亮脚本:

global.R
df <-read.csv("https://dl.dropbox.com/s/5w09dayyeav7hzy/Coordinatestest.csv",
           header = T,
           stringsAsFactors = F)
df$Time <- as.Date(df$Time, "%m/%d/%Y")
countriesSP <- getMap(resolution='low')

ui.R
library(devtools)
library(leaflet)
library(htmlwidgets)
library(shiny)
library(shinydashboard)
library(sp)
library(rworldmap)
library(RCurl)

header <- dashboardHeader(
   title = 'Shiny Memery'
)
body <- dashboardBody(
fluidRow(
  tabBox(
  tabPanel("My Map", leafletOutput("mymap",height = 550)),
  width = 700
))

)


dashboardPage(
header,
dashboardSidebar(

sliderInput('Timeline Value','Time line',min = min(df$Time),max =    max(df$Time), value = min(df$Time)),

selectInput("select_country", label = "Select Country", 
            choices = NULL, 
            selected = NULL)

),
body
)

server.R

shinyServer(function(input, output, session) {



output$mymap <- renderLeaflet({

df <- subset(df, df$Time <= input$`Timeline Value`)

observe({
  
  pointsSP <- SpatialPoints(df[,c("lon", "lat")],  proj4string=CRS(proj4string(countriesSP)))
  
  indices <- over(pointsSP, countriesSP)
  
  part_choices <- as.list(c("All",  na.omit(unique(as.character(indices$ADMIN)))))
  
  updateSelectInput(session, "select_country", choices=part_choices)
})

  lng <- ifelse(input$select_country == "All", mean(df$lon), 0)
  lat <- ifelse(input$select_country == "All", mean(df$lat), 0)


  m <- leaflet(df) %>%
    addTiles(
    #urlTemplate = "http://otile4.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.png"
  ) %>%  # Add default OpenStreetMap map tiles
  #setView(mean(df$lon), mean(df$lat), zoom = 5) %>%
  setView(lng, lat, zoom = 5) %>%
  addMarkers(~lon, ~lat, 
             clusterOptions = markerClusterOptions())

 })

})

请将脚本复制并粘贴到 Rstudio 中并运行。您将看到,当您将时间线拖到末尾时,国家/地区选项将会增加,但默认始终为All。理想情况下,当我选择一个国家时,正如您所看到的,基于一些简单的逻辑,只要选择不是All

setview()
函数中的坐标应该是(0,0)(这可以稍后动态,目前我只是想要
setview()
改变地图的焦点)。这个功能目前还没有真正起作用,即当我选择其他国家时,地图的焦点将更改为(0,0),但立即再次变回默认焦点(
mean(df$lon)
mean(df$lat)
)并且选择将也改回全部

那么您知道如何更改我的代码以使其工作吗?

r google-maps shiny r-leaflet
1个回答
1
投票

我已经更改了 server.R 部分,我认为应该如何完成此操作。让我知道这是否有帮助。

服务器.R

     shinyServer(function(input, output, session) {

            dfs <- reactive({
                    tmp <- subset(df, df$Time <= input$`Timeline Value`)  
                    tmp
            })

            part_choices <- reactive({
                    tmp <- dfs()
                    pointsSP <- SpatialPoints(tmp[,c("lon", "lat")],  proj4string=CRS(proj4string(countriesSP)))
                    indices <- over(pointsSP, countriesSP)
                    as.list(c("All",  na.omit(unique(as.character(indices$ADMIN)))))
            })

            observe({
                    updateSelectInput(session, "select_country", choices=part_choices())
            })
             output$mymap <- renderLeaflet({
                     lng <- ifelse(input$select_country == "All", mean(df$lon), 0)
                     lat <- ifelse(input$select_country == "All", mean(df$lat), 0)
                     m <- leaflet(dfs()) %>%
                             addTiles(
                                     #urlTemplate = "http://otile4.mqcdn.com/tiles/1.0.0/sat/{z}/{x}/{y}.png"
                             ) %>%  # Add default OpenStreetMap map tiles
                             #setView(mean(dfs()$lon), mean(dfs()$lat), zoom = 5) %>%
                             setView(lng, lat, zoom = 5) %>%
                             addMarkers(~lon, ~lat, 
                                        clusterOptions = markerClusterOptions())

            })

    })
© www.soinside.com 2019 - 2024. All rights reserved.