【问题标题】:Change setView dynamically according to select box in R shiny app根据 R 闪亮应用中的选择框动态更改 setView
【发布时间】:2017-03-21 18:39:17
【问题描述】:

我正在用 R Shiny 开发一张传单地图。在这个应用程序中,我希望在 setView() 中的 lnglat 值发生变化时更改地图的焦点。 lnglat 值基于我从下拉框中选择的国家/地区。以前我在 ifelse() 函数中使用 lnglat 的静态值,并且应用程序可以正常工作。但是现在的问题是,当我想让事情变得更通用时: lnglat 将是所选数据子集的经度和纬度的平均值国家,应用程序不再显示地图(从我的角度来看,计算似乎正确)

以下是简化且可行的 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() 函数中使用的 lnglat 值。在我将 else 参数更改为计算后,应用程序不再工作。

如果有人能告诉我我错在哪里,真的很感激。

提前致谢。

【问题讨论】:

    标签: r shiny leaflet gis


    【解决方案1】:

    在您的ui.R 中,尝试将您的国家/地区输入更改为

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

    我的猜测是 ifelses 不返回数字,因为 input$select_country 被初始化为 NULL,这(原因我不清楚)导致 renderLeafletupdateSelectInput 不运行,防止更新国家选择器。

    【讨论】:

    • 您好,Wong,非常感谢您的帮助。现在可以了。我一直在看服务器部分,并没有意识到 ui.R 中的这个简单更改可以解决我长期以来一直在研究的问题。非常感谢。
    猜你喜欢
    • 2016-11-21
    • 2021-11-19
    • 2016-12-25
    • 1970-01-01
    • 2014-12-22
    • 2013-12-22
    • 2017-06-07
    • 2015-01-15
    相关资源
    最近更新 更多