我正在创建一个闪亮的传单地图来记录我去过的地方。我有一个包含坐标和时间的数据集。在我闪亮的应用程序中,我有两个小工具 - 一个时间线的滑动条,一个下拉框显示我曾经去过的当前国家。下拉框中的国家/地区选项基于时间线滑块。比如说:2016年之前地图上的所有坐标都在国家A中,然后在下拉框中,下拉框中只有一个选项(国家A)。在2016-01-01之后,我在下拉框中增加到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中并运行它。当您将时间线拖到结尾时,您会看到国家/地区选项将增加,但默认值始终为全部。理想情况下,当我选择一个国家并根据一些简单的逻辑看时,只要选择不是全部,setview()
函数中的坐标应为(0,0)(这可以稍后是动态的,目前我只想让setview()
改变地图的焦点。此功能目前尚未正常工作,即当我选择其他国家/地区时,地图的焦点将更改为(0,0),但会立即再次更改回默认焦点(mean(df$lon)
,mean(df$lat)
)并且选择也将变回全部。
所以关于如何改变我的代码以使其工作的任何想法?
希望你在这个例子中清楚我的情况。
非常感谢帮助
答案 0 :(得分:1)
我已经更改了server.R部分我认为应该如何完成。如果这有帮助,请告诉我。
server.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())
})
})