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는 아래와 같다.



0 개의 댓글:

댓글 쓰기