2019년 1월 21일 월요일

[R shiny] interactive mapping 그림 만들기

 "Rshiny에서 interactive mapping 그림을 만들기 위해서는 leaflet 패키지를 이용해야 한다. leaflet 패키지를 미리 설치하자.

install.packages("leaflet")
 "server.R 코드는 아래와 같다. 처음에 leaflet을 이용하기 위한 renderLeaflet({ }) 틀을 만든다. renderLeaflet가 아닌 다른 틀을 쓴다면 오류가 발생한다.

 연습 데이터를 만들기 위해 sample 함수를 이용하여 127,127.1,127.2 ~ 128.8,128.9,129 사이에서 100개의 경도를 중복을 허용하여 랜덤으로 발생시키고 위도도 sample 함수를 이용하여 35,35.1,35.2 ~ 36.8,36.9,37 사이에서 100개를 발생시켰다. 또한, 1~100 사이에서 value 값을 랜덤으로 발생시켰다. 랜덤으로 발생시킨 세개의 변수를 이용하여 data라는 데이터를 생성하였다.

 그 다음 leaflet 함수를 이용하여 맵에 조건을 하나씩 넣으면 된다. leaflet(데이터)를 쓴뒤 %>%을 적는다. 조건을 추가할 때마다 %>% 적는 것을 까먹으면 안된다.

 setView으로 맵이 그려질 때 출력되어질 처음 위치를 적어야하는데 setView(lng=경도,lat=위도,zoom=확대 정도)이므로 경도 위도로 위치를 정하고 zoom 정도를 조절하면 된다.

 addProviderTiles는 그림의 형식을 바꿀 수 있는 함수이다. 이 함수를 쓰지 않으면 해안선에 보라색이 있는 그림이 출력되지만addProviderTiles(providers$CartoDB.Positron)를 추가해주면 보라색 해안선이 없는 간단한 그림이 출력된다. names(providers)을 하면 여러가지 그림 형식이 나오니 취향에 맞게 쓰면된다.

 다음으로 이용한 함수는 addCircles인데 위경도 위치를 표현하는 표시를 원으로 바꿔준다. addCircles(lng=경도,lat=위도,popup=원클릭시 출력되는 문자,radius=원의 크기,fillColor=원의 색깔,stroke=원 테두리 출력 여부, fillOpacity=원 안 색깔의 투명도 정도)로 구성되어 있다. popup에 위치의 값을 출력하고 싶을 때 숫자만 넣으면 출력이 안되니 as.character로 숫자를 문자로 바꿔야한다.

 마지막으로 addLegend는 그림에서 처럼 설명을 넣을 수 있는 기능이다. addLegend(위치,colors=색,title=legend 이름,labels=레전드 설명)으로 구성된다.


library(shiny)
library(leaflet)

server <- function(input,output, session){
  
  output$map <- renderLeaflet({
    
    data<-data.frame(longitude=sample(seq(127,129,0.1),100,replace=T),latitude=sample(seq(35,38,0.1),100,replace=T),value=sample(1:100,100,replace=T))
    
    m <- leaflet(data=data) %>%
         setView(lng=128, lat=37 , zoom=6) %>%
         addProviderTiles(providers$CartoDB.Positron) %>%
         addCircles(lng=data$longitude,lat=data$latitude,popup=as.character(data$value),radius=data$value*100,fillColor="blue",stroke=FALSE,fillOpacity=0.4) %>%
         addLegend("bottomleft",colors="blue",title="Color",labels=c(">1000"))
    
  })
  
}
 ui.R 코드는 아래와 같다. server에서 생성한 leaflet 그림을 출력하기 위해서 leafletOutput(server에 생성한 그림의 이름,width=넓이 값,height=높이값) 함수를 이용하면 interative mapping 그림을 만들 수 있다.


library(shiny)
library(leaflet)

ui <- fluidPage(
  
  leafletOutput("map",height = 800)
  
)
https://inziwiduk.shinyapps.io/VoMd/에 들어가면 interactive mapping을 응용하여 만든 R shiny를 확인해볼 수 있다.

2019년 1월 20일 일요일

[R 강의] Rstudio 오류가 발생하는 경우

RStudio 실행시 fatal error가 발생하거나 실행이 되었더라도 패키지 설치시 경로에 ?가 있어 패키지 설치가 제대로 안되는 경우가 있습니다.

컴퓨터 설치시 입력한 컴퓨터 이름이 한글인 경우에 RStudio 오류가 발생합니다. 문제를 해결하는 가장 간단한 방법은 컴퓨터 계정을 영어이름으로 하나 더 만들고 영어 이름 계정으로 들어가 RStudio를 실행하면 됩니다.

윈도우10 기준으로 새로운 계정 생성은 제어판 -> 사용자 계정 -> 다른 계정 관리 -> PC 설정에서 새 사용자 추가 -> 다른 사용자 - 이 PC에 다른 사용자 추가 -> 계정생성을 하면 됩니다.










새로운 계정으로 들어가고 싶으시면 왼쪽 맨 아래에 있는 윈도우 표시를 누른 뒤 계정 아이콘을 누르면 새로운 계정을 선택할 수 있습니다. 해당 아이디로 로그인 한 뒤 RStudio를 찾아 실행하면 오류가 발생하지 않습니다. 바탕화면에 아무것도 없어서 R과 RStudio를 다시 설치해야 할 것 같지만 검색을 통해 RStudio를 찾으면 실행이 가능합니다.


R을 자주 이용하시는 분이라면 컴퓨터 설치시 컴퓨터 이름을 영문으로 설정하는 것이 좋습니다.

2019년 1월 14일 월요일

[R shiny] 계단식으로 연결된 selectInput 만들기

해양데이터를 이용하여 한국 해역에 플랑크톤, 해파리, 저서동물을 표현해주는 R shiny를 부탁받았다. 어떻게 만드는게 좋을지 고민하던 중 플랑크톤을 선택하면 플랑크톤 종을 선택할 수 있고 해파리를 선택하면 해파리 종을 선택할 수 있는 selectInput을 만들어보고 싶었다.

R shiny의 Server 부분부터 만드는게 이해하기가 쉽다. 가장 쉽게 두개의 selectInput만을 연결하기 위해 renderUI를 두 개 만든다. 맨 처음에 플랑크톤, 해파리, 저서동물인지를 선택하는 selectInput을 만든다. selectInput(selectInput의 이름, UI에 표출되는 selectInput의 이름, selectInput의 선택지, selected=초기에 선택되는 항목)으로 구성된다.

다음으로 연결시키려는 selectInput을 만들때 조건을 추가한다. 앞에서 만든 selectInput의 이름을 Data라고 했었는데 사용자가 선택한 값은 input$Data에 저장된다. 조건문을 이용하여 input$Data이 null일 때 return(NULL)이라하면 아무것도 출력되지 않는다. 다음 조건으로  플랑크톤, 해파리, 저서동물을 선택할 때 출력되는 selectInput을 각각 만들면 Server에서 할일은 끝났다.

# library
library(shiny)

# Server
shinyServer(function(input, output){
  
  output$Data<-renderUI({
    
    selectInput("Data","Data",choices = c("NONE","Plankton","Jellyfish","Animal"),selected="NONE")
    
  })
  
  output$C<-renderUI({
    
    if(is.null(input$Data)){
      
      return(NULL)
      
    }else if(input$Data=="Plankton"){
      
      selectInput("C", "Abundance(cells/mL):",c("NONE",paste("Plankton",1:5)),selected="NONE")
      
    }else if(input$Data=="Jellyfish"){
      
      selectInput("C", "Abundance(cells/mL):",c("NONE",paste("Jellyfish",1:5)),selected="NONE")
      
    }else if(input$Data=="Animal"){
      
      selectInput("C", "count",c("NONE",paste("Animal",1:5)),selected="NONE")
      
    }else{
      
      
    }
    
  })
  
})
마지막으로 UI의 siderPanel 부분에 앞에서 만든 selectInput을 uiOutput(selectInput 이름)으로 이용해 넣기만 하면 된다.

# library
library(shiny)

# UI
shinyUI(fluidPage(
  
  sidebarPanel(

    uiOutput("Data"),
    uiOutput("C")

  )

))
생성한 R Shiny는 아래와 같다.



2019년 1월 13일 일요일