본문 바로가기

배운 책들 정리/공공데이터로 배우는 R 데이터 분석 with 샤이니

공공데이터 with 샤이니 12_2 - 샤이니 app 활용 사례 (커피 전문점 접근성)

1. 샤이니 app 활용 사례 : 커피 전문점 접근성 분석하기 

1) 라이브러리 불러오기 

 

load("./data/coffee/coffee_shop.rdata")
head(coffee_shop, 2)
library(shiny);library(leaflet);library(leaflet.extras);library(dplyr)

 

2) ui 구현하기

 

ui <- bootstrapPage(
  # 페이지 스타일 설정
  tags$style(type = "text/css", "html, body {width:100%;height:100%"),
  # 지도 설정
  leafletOutput("map", width = "100%", height = "100%"),
  # 메뉴 패널
  absolutePanel(top = 10, right = 10,
                # 선택 입력
                selectInput(
                  inputId = "sel_brand", # 입력 id
                  labe = tags$span(      # 라벨
                    style="color: black;", "프랜차이즈를 선택하시오"),
                  choices = unique(coffee_shop$brand), # 선택 리스트
                  selected = unique(coffee_shop$brand)[2]), # 기본 선택
                # 슬라이드 입력
                sliderInput(
                  inputId = "range",      # 입력 아이디
                  label = tags$span(      # 라벨
                    style="color: black;", "접근성 범위를 선택하시오"),
                  min = 0,               
                  max = 100,
                  value = c(60,80),       # 기본 선택 범위
                  step = 10),             # 단계
                # 출력
                plotOutput("density", height = 230),
  )
)

 

 

3) 서버 구현부터 실행까지

 

# 반응식 : 브랜드 선택
server <- function(input, output, session) {
  brand_sel = reactive({
    brand = subset(coffee_shop,
                   brand == input$sel_brand &
                     metro_idx >= input$range[1] &
                     metro_idx <= input$range[2] 
    )
  })
  
  
  
  # 밀도 함수 출력
  output$density <- renderPlot({
    ggplot(data = with(density(plot_sel()$metro_idx),
                       data.frame(x,y)), mapping = aes(x,y))+
      geom_line()+
      xlim(0, 100) +
      xlab('접근성 지수')+ ylab('빈도')+
      geom_vline(xintercept = input$range[1], color='red', size=0.5)+
      geom_vline(xintercept = input$range[2], color='red', size=0.5)+
      theme(axis.text.y = element_blank(),
            axis.ticks.y = element_blank())
  })
  # 지도 출력
  output$map <-  renderLeaflet({
    leaflet(brand_sel(), width = "100%", height = "100%") %>% 
      addTiles() %>% 
      setView(lng = 127.0381, lat = 37.59512, zoom = 11) %>% 
      addPulseMarkers(lng = ~x, lat = ~y,
                      label = ~name,
                      icon = makePulseIcon())
    
  })
  
  
  
  
}


shinyApp(ui, server)

 

결과 값

 

* 핵심

- addPulseMarkers : 레이더처럼 표시 되는 마크

- geom_vline(xintercept = input$range[1], color='red', size=0.5) : 구분선

- selectInput : 선택 입력

 

 

728x90
반응형
LIST