2017-09-24 2 views
1

まず、私は完全な解決策を持っていますhereシャイニーリーフレットマップと行に基づくフィルタを作成する方法。シャイニーリーフレットマップ - 行ではなく列でデータをフィルタリングする

ここでは、フィルターが列に適用される非常に似たマップを示したいと思います。あまりにもつまずいた。

年ごとにアメリカの大人の喫煙の地図を作成し、異なる色で%を強調表示したいと思います。 .CSV形式で

データhere

シェープファイルがhere

ですされ、現在、私のマップは、この

Currently, my map looks like this

のように見えますこれは私のコードです:

# Set directory 
setwd("C:/DC/R/Shiny/US Adult Smoking by State") 

# Upload packages 
library(ggthemes) 
library(rgdal) 
library(sp) 
library(leaflet) 
library(shinythemes) 

# Read dataset 
smoking <- read.csv("US adult smoking by state1.csv", header = TRUE) 

# Leaflet map 
states <- readOGR(dsn = "C:/DC/R/Cool datasets/US smoking", layer = 
"cb_2016_us_state_500k", 
       encoding = "UTF-8", verbose = FALSE) 

# Merge data 
# require(sp)! For spatial dataframe! 
smoking.df <- merge(states, smoking, by.x = "NAME", by.y = "state") 
class(smoking.df) 

# Create palette 
pal <- colorBin("Reds", c(0, 30), na.color = "#808080", 
      alpha = FALSE, reverse = FALSE) 


# UI 
ui <- shinyUI(fluidPage(theme = shinytheme("united"), 
        titlePanel(HTML("<h1><center><font size=14> US Adult 
Smoking by State in 2015-2017</font></center></h1>")), 
        sidebarLayout(
         sidebarPanel(
         selectInput("stateInput", label = h3("State"), 
            choices = c("Choose state", 
               "Alabama", 
               "Alaska", 
               "Arizona", 
               "Arkansas", 
               "California", 
               "Colorado", 
               "Connecticut", 
               "Delaware", 
               "Florida", 
               "Georgia", 
               "Hawaii", 
               "Idaho", 
               "Illinois", 
               "Indiana", 
               "Iowa", 
               "Kansas", 
               "Kentucky", 
               "Louisiana", 
               "Maine", 
               "Maryland", 
               "Massachusetts", 
               "Michigan", 
               "Minnesota", 
               "Mississippi", 
               "Missouri", 
               "Montana", 
               "Nebraska", 
               "Nevada", 
               "New Hampshire", 
               "New Jersey", 
               "New Mexico", 
               "New York", 
               "North Carolina", 
               "North Dakota", 
               "Ohio", 
               "Oklahoma", 
               "Oregon", 
               "Pennsylvania", 
               "Rhode Island", 
               "South Carolina", 
               "South Dakota", 
               "Tennessee", 
               "Texas", 
               "Utah", 
               "Vermont", 
               "Virginia", 
               "Washington", 
               "West Virginia", 
               "Wisconsin", 
               "Wyoming" 
               ), 
            selected = "Choose state"), 
         selectInput("stateInput", label = h3("State"), 
            choices = c("Choose year", 
               "2015", 
               "2016", 
               "2017"), 
            selected = "Choose year")), 
         mainPanel(leafletOutput(outputId = 'map', height = 
800) 
         )) 
        )) 



# SERVER 
server <- shinyServer(function(input, output) { 
output$map <- renderLeaflet({ 
leaflet(smoking.df) %>% 
    addProviderTiles(providers$Stamen.TonerLite) %>% 
    setView(lng = -98.583, lat = 39.833, zoom = 4) #%>% 

}) 
# observers 

# selected state 
selectedState <- reactive({ 
smoking.df[smoking.df$NAME == input$stateInput, ] 
}) 

observe({ 
state_popup <- paste0("<strong>State: </strong>", 
         selectedState()$NAME, 
         "<br><strong>% of smoking adults in 2015: </strong>", 
         selectedState()$adult_smoking_2015, 
         "<br><strong>% of smoking adults in 2016: </strong>", 
         selectedState()$adult_smoking_2016, 
         "<br><strong>% of smoking adults in 2017: </strong>", 
         selectedState()$adult_smoking_2017) 

leafletProxy("map", data = selectedState()) %>% 
    clearShapes() %>% 
    addPolygons(fillColor = "orange", 
       popup = state_popup, 
       color = "#BDBDC3", 
       fillOpacity = 0.8, 
       weight = 1) 
}) 

# selected year 
selectedYear <- reactive({ 
smoking.df[smoking.df$adult_smoking_2015 == input$yearInput & 
      smoking.df$adult_smoking_2016 == input$yearInput & 
      smoking.df$adult_smoking_2017 == input$yearInput,] 
}) 

observe({ 
state_popup1 <- paste0("<strong>State: </strong>", 
         selectedState()$NAME) 

leafletProxy("map", data = selectedYear()) %>% 
    clearShapes() %>% 
    addPolygons(fillColor = ~pal(selectedYear()$yearInput), 
       popup = state_popup1, 
       color = "#BDBDC3", 
       fillOpacity = 0.8, 
       weight = 1) 
}) 


}) 


# Run app! 
shinyApp(ui = ui, server = server) 

だから、私はinputYearとうまくやっているという私の前提と、チラシマップのカラーパレットも使っています。年は列であり、今私のミスがどこにあるのか理解するのは少し難しいです。

すべてのヒントに非常に感謝しています。うまくいけば、私の質問は他の人にも役立つでしょう。

私の望ましい結果は、以下のチラシで作成したものです。私はフィルタで年を変えて、地図上で変更を受けたいと思っています。 enter image description here

+1

おかしい、あなたはすでに望ましい出力を作成しています。それで、あなたが手元にあるときに解決策を尋ねる理由は何ですか?あなたが言ったことを誤解していますか?また、このバージョンでは、パラメータとして状態を入力するのではなく、唯一のパラメータは年ですか? –

+0

@Patrik_P、私の出力はリーフレットで作成されました。はい、単一のマップです。私はシャイニーに入れたい。毎年3つの地図。これまでのところサーバーフィルターは機能しません。 – Oleksiy

答えて

1

予備的な解決策(私のものではなく、他のスマートな人々からのもの)。さらにシェイプファイルはgeojsonに置き換えられました。

# Upload packages 
library(rgdal) 
library(sp) 
library(leaflet) 
library(geojsonio) 
library(shinythemes) 
library(shiny) 

# Read dataset 
smoking <- read.csv("US adult smoking by state1.csv", header = TRUE) 

# Leaflet map 
# states <- readOGR(dsn = ".", layer = 
#     "cb_2016_us_state_500k", 
#     encoding = "UTF-8", verbose = FALSE) 

states <- geojson_read("gz_2010_us_040_00_500k.json",what = "sp") 

# Merge data 
# require(sp)! For spatial dataframe! 
smoking.df <- merge(states, smoking, by.x = "NAME", by.y = "state") 


# UI 
ui <- shinyUI(fluidPage(theme = shinytheme("united"), 
        titlePanel(HTML("<h1><center><font size=14> US Adult 
            Smoking by State in 2015-2017</font> 
</center></h1>")), 
        sidebarLayout(
         sidebarPanel(
         selectizeInput(
          "stateInput", 'State', choices = "", multiple = 
FALSE, 
          options = list(
          placeholder = 'Please select a state from 
below') 
         ) 
         , 
         selectInput("yearInput", label = h3("Year"), 
            choices = c("Choose year", "2015", # 
Choose year was added! 
               "2016", 
               "2017"))), 
         mainPanel(leafletOutput(outputId = 'map', height = 
               800) 
        )) 
        )) 


# SERVER 
server <- shinyServer(function(input, output, session) { 

updateSelectizeInput(session, "stateInput", choices = smoking.df$NAME, 
        server = TRUE) 
# selected state 
selectedState <- reactive({ 
smoking.df[smoking.df$NAME == input$stateInput, ] 
}) 
# selected year 
selectedYear <- reactive({switch(input$yearInput, 
           "2015"=smoking.df$adult_smoking_2015, 
           "2016"=smoking.df$adult_smoking_2016, 
           "2017"=smoking.df$adult_smoking_2017) 
}) 
pal2 <- colorNumeric(palette = "Reds", domain=NULL) 

output$map <- renderLeaflet({ 
leaflet(smoking.df) %>% 
    addProviderTiles(providers$Stamen.TonerLite) %>% 
    setView(lng = -98.583, lat = 39.833, zoom = 4) %>% 
    addPolygons(data = smoking.df ,fillColor = ~pal2(selectedYear()), 
       popup = paste0("<strong>State: </strong>", 
          smoking.df$NAME), 
       color = "#BDBDC3", 
       fillOpacity = 0.8, 
       weight = 1) 

    }) 

    observeEvent(input$stateInput, { 
    state_popup <- paste0("<strong>State: </strong>", 
         selectedState()$NAME, 
         "<br><strong>% of smoking adults in 2015: </strong>", 
         selectedState()$adult_smoking_2015, 
         "<br><strong>% of smoking adults in 2016: </strong>", 
         selectedState()$adult_smoking_2016, 
         "<br><strong>% of smoking adults in 2017: </strong>", 
         selectedState()$adult_smoking_2017) 

    leafletProxy("map", data = selectedState()) %>% 
    clearGroup(c("st.ate")) %>% 
    addPolygons(group ="st.ate",fillColor = "orange", 
       popup = state_popup, 
       color = "#BDBDC3", 
       fillOpacity = 0.8, 
       weight = 5) 
}) 

}) 

# Run app! 
shinyApp(ui = ui, server = server) 

電流出力: Just a map by year

A map by year with selected state

現在の問題:

  1. 地図、まだ変更の年の2秒にGeoJSONと遅い、それが再描画されます。

  2. 灰色は選択なしで地図に表示されます。何か案は? As for now

は、1つの以上のフィルタを追加しようと、あなたが投稿し続けます。

+1

オンポイント1:あなたgeojsonソリューションは、メモリが高価です、それはそのファイルの2 MB以上を読んでいる。なぜarcgisから400KBのシェイプファイルをダウンロードできないのですか?https://www.arcgis.com/home/item.html?id=f7f805eb65eb4ab787a0a3e1116ca7e5; 'states < - readOGR(" states.shp ")'? 2。:アプリの起動時に選択するものを選択しなかったため、グレーです。表現をしたい場合は、たとえば2015年の –

+0

@Patrik_Pからデータをフィードする必要があります。ご意見ありがとうございます!まあ、私はgeojsonの消費量が少ないと思った。以前シェイプファイルを使っていましたが、それははるかに遅いです。フィルタを変更するための5秒間、地図のように見える "考える"。おそらく毎回再描画されるからです。グレーについて言えば、私はシンプルなリーフレットには何も灰色がありませんでした。ここでそれは異なっている。そして、私はグレーなしで完璧に動作する別のアプリを持っています。たとえば、このhttps://stackoverflow.com/questions/46186014/changing-leaflet-map-according-to-input-without-redrawing-multiple-polygonsを確認してください。 – Oleksiy

関連する問題