【发布时间】:2017-03-21 18:39:17
【问题描述】:
我正在用 R Shiny 开发一张传单地图。在这个应用程序中,我希望在 setView() 中的 lng 和 lat 值发生变化时更改地图的焦点。 lng 和 lat 值基于我从下拉框中选择的国家/地区。以前我在 ifelse() 函数中使用 lng 和 lat 的静态值,并且应用程序可以正常工作。但是现在的问题是,当我想让事情变得更通用时: lng 和 lat 将是所选数据子集的经度和纬度的平均值国家,应用程序不再显示地图(从我的角度来看,计算似乎正确)
以下是简化且可行的 R 脚本:
global.R:
library(devtools)
library(leaflet)
library(htmlwidgets)
library(shiny)
library(shinydashboard)
library(sp)
library(rworldmap)
library(RCurl)
library(ggmap)
df <- read.csv(url("https://docs.google.com/spreadsheets/d/1rrEJiuxr4nafTqUQBlPpUdGwvGeGtBJExlPJdday2uw/pub?output=csv"),
header = T,
stringsAsFactors = F)
df$Time <- as.Date(df$Time, "%d/%m/%Y")
ui.R
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 = c(min(df$Time), min(df$Time)+10)),
selectInput("select_country", label = "Select Country",
choices = NULL,
selected = NULL)
),
body
)
服务器.R
shinyServer(function(input, output, session) {
dfs <- reactive({
tmp <- subset(df, df$Time <= input$`Timeline Value`[2] & df$Time >= input$`Timeline Value`[1])
tmp
})
part_choices <- reactive({
as.list(c("All", unique(as.character(dfs()$Country))))
})
observe({
updateSelectInput(session, "select_country", choices=part_choices())
})
output$mymap <- renderLeaflet({
lng <- ifelse(input$select_country == "All", mean(dfs()$lon),
mean(subset(dfs(), Country %in% input$select_country)$lon)
)
lat <- ifelse(input$select_country == "All", mean(dfs()$lat),
mean(subset(dfs(), Country %in% input$select_country)$lat)
)
m <- leaflet(dfs()) %>%
addTiles(
) %>%
setView(lng, lat, zoom = 5) %>%
addMarkers(~lon, ~lat,
clusterOptions = markerClusterOptions())
})
})
您将在 server.R 部分中看到我使用 ifelse() 来更改稍后可以在 setView() 函数中使用的 lng 和 lat 值。在我将 else 参数更改为计算后,应用程序不再工作。
如果有人能告诉我我错在哪里,真的很感激。
提前致谢。
【问题讨论】: